退出哪个进程以及为什么在退出(0)后关闭(0)调用

时间:2015-03-12 18:37:18

标签: c process fork exit

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);甚至会执行吗?

此代码是否只是为了测试是否可以创建子进程?

更新 好的,我从这个问题Start a process in the background in Linux with C得到了它。

基本上,close(0);会关闭子进程的当前标准输入,并打开/dev/null作为输入设备。这样子进程将表现为deamon,不会从终端或标准输入中读取任何内容。

1 个答案:

答案 0 :(得分:4)

fork返回父进程中的进程id,并在子进程中返回0。主要调用进程正在退出,因为pid == 0所以if (pid)在父项中为真,在子项中为false。然后孩子进入close(0)等等。