【发布时间】:2017-03-11 02:43:21
【问题描述】:
说,我写了一个守护进程。 有两种选择,不知道选哪个:
选项 1:
int
main(void)
{
/* Do something with run_as_daemon variable */
if (run_as_daemon) {
pid = fork();
if (pid < 0)
err_exit("Could not fork to create daemon");
if (pid > 0)
exit(0); /* exit if parent */
} else {
do_task(); /* Perform some IO using user commands */
}
}
选项 2:
int
main(void)
{
if (run_as_daemon) {
pid = fork();
if (pid < 0)
err_exit("Could not fork to create daemon");
if (pid > 0)
exit(0); /* exit if parent */
}
do_task(); /* Perform some IO using user commands */
}
我知道他们做同样的事情,但想知道如何更好地构建代码以使其更易于维护和阅读。
【问题讨论】:
-
您认为这两个程序等效(“做同样的事情”)的前提是不正确的。这两个程序之间存在差异。在选项 1 中,仅当
run_as_daemon计算结果为false时才调用do_task()。子进程不会调用对do_task()的调用在选项2 中,无论run_as_daemon的计算结果如何,都会调用do_task()。 -
我个人曾经使用第一个选项。它由“读者”完全管理和更好地理解。
-
你也应该管理
pid==0和exit这个案例,以使解决方案等效 -
这两个对于成功启动的子进程是不等价的,即如果
fork()返回零。 -
这里强调的不是正确性,而是如何构建程序。我的意思是:“应该包括
else明确(通过其他)或隐含(条件检查后继续)。