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
作为输入设备。这样子进程将表现为一个恶进程,不会从终端或标准输入读取任何内容。
fork 在父进程中返回进程 id,在子进程中返回0
。 主调用进程正在退出,因为pid == 0
因此if (pid)
在父级中为 true,而在子项中为 false。 然后孩子继续close(0)
,等等。