Какой процесс завершается и почему после exit (0) следует вызов close (0)

if (log_daemon) {
    pid_t pid;
    log_init();

    pid = fork();
    if (pid < 0) {
        log_error("error starting daemon: %m");
        exit(-1);
    } else if (pid)
        exit(0);

    close(0);
    open("/dev/null", O_RDWR);
    dup2(0, 1);
    dup2(0, 2);

    setsid();

    if (chdir("/") < 0) {
        log_error("failed to set working dir to /: %m");
        exit(-1);
    }
}

У меня есть программа на c, и я не могу понять, что делает exit(0); в этом случае, из какого процесса она выходит? и для чего используется close(0);? Будет ли close(0); даже выполняться?

Этот код предназначен только для проверки возможности создания дочернего процесса?

ОБНОВЛЕНИЕ: хорошо, я получил его из этого вопроса Запустить процесс в фоновом режиме в Linux с помощью C.

По сути, close(0); закрывает текущий стандартный ввод для дочернего процесса и открывает /dev/null как устройство ввода. Таким образом, дочерний процесс будет вести себя как демон и ничего не будет читать с терминала или стандартного ввода.


person Community    schedule 12.03.2015    source источник


Ответы (1)


Вилка возвращает идентификатор процесса в родительском процессе и 0 в дочернем процессе. Основной вызывающий процесс завершается, потому чтоpid == 0, поэтому if (pid) истинно в родительском и ложно в дочернем. Затем ребенок переходит к close(0) и т. Д.

person shooper    schedule 12.03.2015
comment
Это то, что я подумал, так что в этом случае родитель выходит, а ребенок забирается init, правильно? - person ; 12.03.2015