Эквивалентный клону из ветвления?

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

Есть ли эквивалент clone вызов к старому доброму fork()?

Я уже знаком с fork, и полагайте этому, если у меня есть начальная точка в clone, Я могу добавить флаги и опции оттуда.

6
задан Stéphan Kochen 24 May 2010 в 16:41
поделиться

3 ответа

Я думаю, что это сработает, но я не совсем уверен в некоторых аргументах указателя.

pid_t child = clone( child_f, child_stack, 
           /* int flags                */     SIGCHLD, 
           /* argument to child_f      */     NULL,
           /* pid_t *pid               */     NULL,
           /* struct usr_desc * tls    */     NULL,
           /* pid_t *ctid              */     NULL );

В параметре flags младший байт используется для указания, какой сигнал отправить, чтобы уведомить родительский элемент потока о таких вещах, как смерть или остановка. Я считаю, что все фактические флаги включают переключатели, которые отличаются от fork . Глядя на код ядра, можно предположить, что это так.

Если вы действительно хотите получить что-то близкое к fork , вы можете вызвать sys_clone , который не принимает указатель на функцию и вместо этого возвращает дважды, как fork .

2
ответ дан 17 December 2019 в 18:10
поделиться

clone () используется для создания потока. Большая разница между clone () и fork () заключается в том, что clone () предназначен для выполнения, начиная с отдельной точки входа - функции, тогда как fork () просто продолжается вниз с той же точки в коде, откуда был вызван. int (* fn) (void *) в определении man-страницы - это функция, которая при выходе возвращает int, статус выхода.

Ближайший вызов clone - это pthread_create (), который по сути является оболочкой для clone (). Это не дает вам возможности получить поведение fork ().

0
ответ дан 17 December 2019 в 18:10
поделиться

Вы можете разветвить нормальный дочерний процесс с помощью fork (), а затем использовать unshare ( ), чтобы создать новое пространство имен.

Пространства имен немного странные, я не вижу много вариантов их использования.

1
ответ дан 17 December 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: