4

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

除了不正确的错误处理之外,(为什么)这工作/不工作?

4

4 回答 4

20

你的建议肯定会奏效。但是,错误处理在任何表现良好的应用程序中都不是可选的。以下实现模式同样简洁,也可以处理错误。此外,它将 fork() 返回值保存在 pid 变量中,以防您稍后想在父级中使用它来等待子级。

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}
于 2008-09-25T17:02:46.110 回答
4

您在父进程中丢失了子进程 ID,这是返回给父进程的 ID。我认为您可以恢复该信息,但可能不是唯一的(也就是说,我认为您可以获得所有孩子的 PID,但不一定是您刚刚分叉的孩子的 PID)。如果您不需要知道孩子的PID,我认为第二种方式很好。

此外,如果分叉中出现错误,则返回 -1,在这两种情况下您都没有测试,这通常是一个错误。

于 2008-09-25T16:58:41.640 回答
2

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

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
于 2008-09-25T16:59:27.707 回答
1

您可以在 C 中自由地执行此操作,并且它会起作用,因为父级和子级将从 fork 接收到不同的返回值 - 并且首先对其进行评估。唯一的问题是您提到的错误处理。此外,如果您想对其进行操作,您将没有任何其他方法来恢复子 PID,例如使用 waitpid 等。

于 2008-09-25T17:01:39.527 回答