叉()作为参数

问题描述:

通常当我需要在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 */ } 

不当处理错误,(为什么)这个工作/不工作?

你的建议肯定会奏效。但是,错误处理在任何运行良好的应用程序中都不是可选的。以下实现模式类似地简洁并且还处理错误。此外,它将fork()返回值保存在pid变量中,以防您稍后在父项中使用它,例如等待子项。

switch (pid = fork()) { 
case -1:  /* Failure */ 
    /* ... */ 
case 0:  /* Child */ 
    /* ... */ 
default:  /* Parent */ 
    /* ... */ 
} 

您失去父级中的子进程ID,这是返回给父级的。我想你可以恢复这些信息,但也许不是唯一的(也就是说,我认为你可以得到你所有孩子的PID,但不一定是你刚分出的孩子的PID)。如果你不需要知道孩子的PID,我认为第二种方法很好。

此外,如果在分叉中存在错误,则返回-1,在任何情况下都未测试,通常是错误。

你应该这样做。我从来不知道它不工作。这就是史蒂文斯的书中所做的。

int p; 
if((p = fork()) == 0) { /* child */ } 
else { /* parent/pray */ } 

你可以*地做,在C,它会工作,因为家长和孩子会从叉收到不同的返回值 - 这是第一次评估。唯一的问题是你提到的错误处理。此外,你不会有任何其他的方式来恢复孩子的PID,如果你想对其进行操作,如waitpid等。