использование clone (): ошибка сегментации - PullRequest
0 голосов
/ 23 июля 2010

Я хочу использовать клон для регистрации текущего состояния моей программы. В нем много циклов, и я хочу отслеживать процесс, не печатая состояние в каждой итерации цикла.

Вот почему я создал это доказательство концепции:

#include <iostream>
#include <cstdlib>

unsigned int i;

int log(void*) {
  std::cout << "LOGGING START" << std::endl;
  while(true) {
    sleep(1);
    std::cout << i << std::endl;
  }
}

int main()  {
  void **child_stack = (void**)malloc(16384);
  i = 0;

  std::clog << "calling clone" << std::endl;
  clone(log, child_stack, CLONE_VM | CLONE_FILES, NULL);
  std::clog << "done" << std::endl;

  while(true) {
    ++i;
  }

  return 0;
}

Когда я запускаю его без GDB, он падает с ошибкой сегментации в clone (), но работает нормально, если я использую GDB. Почему?

Как вы думаете, это хорошая практика или у меня рано или поздно возникнут проблемы? И есть ли лучший способ добиться этого?

Приветствия

1012 * Manuel *

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Аргумент стека для clone является простым void*.Кроме того, стек растет в большинстве архитектур, поэтому указатель стека должен указывать на end выделенной памяти.

В любом случае не следует использовать clone напрямую, есливам действительно нужно избегать любых зависимостей от внешних библиотек.Вместо этого используйте библиотеку pthreads.Он предоставляет гораздо более простой (и безопасный) API.

0 голосов
/ 23 июля 2010

На процессорах Intel аргумент child_stack должен указывать на вершину стека, а не на низ.

В любом случае, я думаю, что использование clone не очень хорошая идея.Существует около трех способов вызова clone, в зависимости от архитектуры, все плохо документированы.Я бы предложил использовать библиотеку pthreads (или, поскольку мы в C ++, Boost.Threads).

...