Как вы клонировать () в 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++ соответственно.