Я хотел бы использовать функции пространства имен clone
функция. Читая страницу справочника, это походит clone
имеет много сложных деталей, о которых я должен волноваться.
Есть ли эквивалент clone
вызов к старому доброму fork()
?
Я уже знаком с fork
, и полагайте этому, если у меня есть начальная точка в clone
, Я могу добавить флаги и опции оттуда.
Я думаю, что это сработает, но я не совсем уверен в некоторых аргументах указателя.
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
.
clone () используется для создания потока. Большая разница между clone () и fork () заключается в том, что clone () предназначен для выполнения, начиная с отдельной точки входа - функции, тогда как fork () просто продолжается вниз с той же точки в коде, откуда был вызван. int (* fn) (void *) в определении man-страницы - это функция, которая при выходе возвращает int, статус выхода.
Ближайший вызов clone - это pthread_create (), который по сути является оболочкой для clone (). Это не дает вам возможности получить поведение fork ().
Вы можете разветвить нормальный дочерний процесс с помощью fork (), а затем использовать unshare ( ), чтобы создать новое пространство имен.
Пространства имен немного странные, я не вижу много вариантов их использования.