2013-03-05 2 views
1

Я читаю о группах процессов и сеансах Linux. Из this site я вижу:Почему мой демон не заканчивается, когда я выхожу из системы?

Когда пользователь выходит из системы, ядро ​​необходимо завершить все процессы уже запущенного пользователь ... Для того, чтобы упростить эту задачу, процессы организуются в наборы сеансов. Идентификатор сеанса совпадает с идентификатором процесса, который создал сеанс с помощью системного вызова setsid(). Этот процесс известен как лидер сеанса для этой группы сеансов. Все потомки этого процесса являются членами этой сессии, если они специально не удаляются из нее. Функция setsid() не принимает никаких аргументов и возвращает новый идентификатор сеанса.

В статье не говорится, что ОС решает прекратить сеансы пользователя. Мое первоначальное предположение заключалось в том, что когда кто-то входит в TTY, TTY является лидером сеанса, и все процессы, вызываемые в этом сеансе, принадлежат ему, если они не звонят setsid(). Однако это явно неверно, как проверено простейшим примером. Рассмотрим этот «демон» ... (я знаю, что это не настоящий демон, но это вилка) ...

#include 
#include 
#include 
#include 

int main(void) { 

    pid_t pid = fork(); 

    if(pid < 0) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
    } 

    if(pid == 0) { 
    FILE * heartbeat_file = fopen("daemon.out", "w"); 
    int hb = 0; 
    while(1) { 
     fprintf(heartbeat_file, "%d\n", hb); 
     fflush(heartbeat_file); 
     hb++; 
     sleep(1); 
    } 
    } 
    exit(EXIT_SUCCESS); 
} 

Из кода, мы видим, что ребенок постоянно пишет в файл, и родитель выходы. Заметьте, что я никогда не звоню setsid().

Если я вхожу в систему, запустите демон и выйдите из системы, а затем войдите в систему, демон все еще работает! Я могу удалить звонок до fork() и, как и ожидалось, процесс завершается, когда я выхожу из системы. Может ли кто-нибудь объяснить, почему fork заставляет приложение не выходить, когда я выхожу из системы?

ответ

1

Когда вы используете fork, позволяя родительскому выходу, вы создаете сиротский процесс (http://en.wikipedia.org/wiki/Orphan_process). Такие сироты переориентированы на процесс init. Я бы предположил из того, что вы заметили, что повторное воссоздание изменяет идентификатор сеанса.

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

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