Почему ветвление () прежде setsid ()

Почему fork() прежде setsid() к daemonize процесс?

В основном, если я хочу отсоединить процесс от его терминала управления и сделать его лидером группы процесса: Я использую setsid().

Выполнение этого, не разветвляясь прежде не работает.

Почему?

37
задан jww 19 April 2014 в 01:56
поделиться

2 ответа

Прежде всего: setsid () сделает ваш процесс лидером группы процессов, но также сделает вас лидером нового сеанса. Если вы просто заинтересованы в создании собственной группы процессов, используйте setpgid (0,0).

Теперь, чтобы понять настоящую причину, по которой setsid () возвращает EPERM, если вы уже являетесь лидером группы процессов или лидером сеанса, вы должны понимать, что идентификаторы группы процессов и сеанса инициализируются из идентификатора процесса, создающего их (и, следовательно, ведущего их, то есть для лидера сеанса pid == sid и для лидера группы процессов pid == pgid). Также группы процессов не могут перемещаться между сеансами.

Это означает, что если вы являетесь лидером группы процессов и создание нового сеанса будет разрешено, тогда sid и pgid будут установлены на ваш pid, оставив другие процессы в вашей старой группе процессов в странном состоянии: их процесс лидер группы внезапно оказывается на другом сеансе, чем они сами. А этого нельзя допустить, отсюда и EPERM ядром.

Теперь, если вы используете fork (), когда вы больше не являетесь ни сеансом, ни лидером группы процессов, и, следовательно, установка sid и pgid на ваш pid безопасна, потому что в такой группе нет других процессов.

Итак, да, подумайте, все это имеет смысл.

52
ответ дан 27 November 2019 в 04:36
поделиться

Требуется fork () и дочерний вызов setsid () , чтобы гарантировать, что вызывающий процесс setsid () еще не является лидером группы процессов ( setsid () хочет сделать вызывающий процесс группой процессов лидер новой группы процессов, поэтому в этом случае он не работает).

18
ответ дан 27 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

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