通常当我需要在C中分叉时,我会这样做:
pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }
我发现我可以抛弃额外的变量并使用:
if(fork() == 0) { /* child */ }
else { /* parent/pray */ }
除了不正确的错误处理,(为什么)这是否有效?
答案 0 :(得分:20)
你的建议肯定会奏效。但是,在任何行为良好的应用程序中,错误处理都不是可选的。以下实现模式同样简洁并且还处理错误。此外,它将fork()返回值保存在pid变量中,以防您稍后在父级中使用它,比如等待子级。
switch (pid = fork()) {
case -1: /* Failure */
/* ... */
case 0: /* Child */
/* ... */
default: /* Parent */
/* ... */
}
答案 1 :(得分:4)
您将失去父级中的子进程ID,这是返回给父级的内容。我认为你可以恢复这些信息,但也许不是唯一的(也就是说,我认为你可以得到你所有孩子的PID,但不一定是你刚刚分叉的孩子的PID)。如果你不需要知道孩子的PID,我认为第二种方法很好。
此外,如果在分叉时出现错误,则返回-1,在任何一种情况下都没有测试,这通常是一个错误。
答案 2 :(得分:2)
你应该这样做。我从来不知道它不起作用。这就是史蒂文斯书中的表现。
int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
答案 3 :(得分:1)
您可以在C中自由地执行此操作,它将起作用,因为父和子将从fork接收不同的返回值 - 并且首先进行评估。唯一的问题是你提到的错误处理。此外,如果您想对其进行操作,例如使用waitpid等,您将没有任何其他方法来恢复子PID。