fork()作为参数

时间:2020-03-06 14:43:59  来源:igfitidea点击:

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

除了错误处理错误之外,(为什么)这行得通/不行?

解决方案

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

另外,如果分叉中有错误,则返回-1,这两种情况下我们都不会测试,这通常是一个错误。

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

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

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

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

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