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,不会从终端或标准输入中读取任何内容。
答案 0 :(得分:4)
fork返回父进程中的进程id,并在子进程中返回0
。主要调用进程正在退出,因为pid == 0
所以if (pid)
在父项中为真,在子项中为false。然后孩子进入close(0)
等等。