2013-12-26 1 views
0

Я пытался демонтировать процесс и обнаружил, что мы должны fork() его дважды. Причина в том, что если процесс является лидером сеанса, тогда он может контролировать tty. Мне было интересно, каково обоснование этой теории.Как лидер сессии может взять под контроль tty в Linux?

ответ

2

Первый вилок для запуска демона в отдельном сеансе. То, что вы должны делать для это режим демона (псевдо-код):

fork() 
if (parent) { 
    return 
else if (child) { 
    setsid(); 
    closefds(); 
    fork(); 
    if (child) { 
     childwork(); 
    } else { 
     exit(0); 
    } 
} 

setsid вызов помещает демона в его собственной сессии и разъединяет его с терминала родительского процесса. Если вы не выполняете вызов setsid, то вы не получите новый сеанс, и демону может быть помешана группа процессов, к которой она все еще принадлежит, т. Е. Ей может быть помешано HUP, отправленное на весь процесс группа.

Второй вызов fork() приводит к тому, что процесс больше не является лидером сеанса. Это означает, что процесс не сможет получить управляющий терминал, если он открывает неиспользуемое терминальное устройство (случайно или намеренно), потому что это не лидер сеанса. Если бы он был еще лидером сессии, вам нужно было бы убедиться, что все открытые вызовы, которые открывают терминальные устройства, должны быть вызваны с O_NOCTTY, чтобы быть в безопасности.

Смежные вопросы