通常,当我需要派生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 */ }抛开错误处理不谈,(为什么)这行得通吗?
发布于 2008-09-25 17:02:46
你的建议肯定会奏效。但是,在任何行为良好的应用程序中,错误处理都不是可选的。下面的实现模式同样简洁,也可以处理错误。此外,它将fork()返回值保存在pid变量中,以防您稍后要在父对象中使用它来等待子对象。
switch (pid = fork()) {
case -1: /* Failure */
/* ... */
case 0: /* Child */
/* ... */
default: /* Parent */
/* ... */
}发布于 2008-09-25 16:58:42
您丢失了父进程中的子进程ID,这是返回给父进程的ID。我认为您可以恢复该信息,但可能不是唯一的(即,我认为您可以获得所有孩子的PID,但不一定是您刚刚派生的孩子的PID )。如果你不需要知道孩子的PID,我认为第二种方法很好。
此外,如果forking中存在错误,则返回-1,而您在这两种情况下都没有对其进行测试,这通常是错误的。
发布于 2008-09-25 16:59:28
您应该改为这样做。我从来不知道它不能工作。史蒂文斯的书里就是这么做的。
int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }https://stackoverflow.com/questions/134501
复制相似问题