Как вы клонируете () в Linux внутри класса и пространства имен? - PullRequest
0 голосов
/ 09 февраля 2011

Я знакомлюсь с курсом по операционным системам, и мы будем использовать вызов clone () в linux для создания потоков, а затем делать с ними кое-что. Кажется, у меня проблемы с использованием только clone ().

Я структурировал свой код в один класс (называемый Домашняя работа ), который находится в пространстве имен для класса ( Курс ). Это может быть проблемой, так как я впервые использовал ключевое слово namespace. Я пытаюсь использовать то, что редко делаю, чтобы стать более опытным с этим, поэтому, если у меня есть глупая ошибка, пусть будет так.

Я нашел несколько статей в Интернете, но они мало чем помогли. Я прочитал справочную страницу, но, думаю, у меня недостаточно опыта, чтобы понять, в чем проблема. Когда-нибудь! Спасибо за любую помощь:)

Я хочу иметь метод для отлова клонов внутри класса:

// -- Header -- //  
namespace _Course_ {  
    class _Homework_ {  
               ...  
        int threadCatch(void *);  
               ...  
   };  
}

// -- Source -- //  
namespace _Course_ {   
  void _Homework_::threadTest(void) {  
             ...  
     // From web article  
     void **childStack;  
     childStack = ( void **) malloc(KILOBYTE);  
     clone(threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);  
             ...  
  }  

  int _Homework_::threadCatch(void * ){  
    cout << getpid() << " cloned." << endl;    
    exit(0);  
  }
}

Это то, что у меня сейчас есть. Я пробовал разные способы (вытащить зрелище из класса, затем пространство имен). Он компилируется дважды, но когда я пытаюсь перекомпилировать после make clean, он говорит мне, что функция (threadCreate) объявлена ​​в нескольких местах. Из-за этих странных ошибок, я уверен, что я делаю что-то не так, и вместо того, чтобы взломать это, я приму некоторые мнения. Что мне делать или что читать дальше? Спасибо!

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Системный вызов clone (2) ожидает указатель на функцию с C связью . Поскольку вы используете C ++, я бы порекомендовал переместить вашу функцию threadCatch() в глобальное пространство имен и объявить ее как функцию extern "C". Вы также можете объявить метод в своем классе как static, но я чувствую, что превращение его в свободную функцию со связью C более точно соответствует способу передачи функции в качестве параметра.

Если вам нужно вызывать объекты C ++ внутри вашей функции threadCatch(), которые существуют вне ее области действия, вы можете передавать указатели на эти объекты как параметр arg для вызова clone(). Ваша функция threadCatch() затем преобразует arg в соответствующий тип, чтобы вы могли получить доступ к вашим объектам (объектам) C ++ соответственно.

1 голос
/ 10 февраля 2011

Определите вашу функцию catch как статическую функцию класса.

static int threadCatch(void *);

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

clone(Homework::threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);
...