Как вы клонировать () в Linux внутри класса и пространства имен?

Я знакомлю вас с курсом по операционным системам, и мы будем использовать вызов 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 make, он сообщает мне, что функция (threadCreate) объявлена ​​в нескольких местах. Из-за этих странных ошибок я уверен, что делаю что-то не так, и вместо того, чтобы взломать это, я приму некоторые мнения. Что мне делать или что читать дальше? Спасибо!

2 ответа

Решение

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

static int threadCatch(void *);

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

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

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

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

Другие вопросы по тегам