Клон-эквивалент вилки? - PullRequest
6 голосов
/ 24 мая 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 мая 2010

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

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.

1 голос
/ 25 мая 2010

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

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

0 голосов
/ 24 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...