首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fork()作为参数

fork()作为参数
EN

Stack Overflow用户
提问于 2008-09-25 16:54:07
回答 4查看 686关注 0票数 4

通常,当我需要派生C语言时,我会这样做:

代码语言:javascript
复制
pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

我突然想到,我可以去掉额外的变量,并使用:

代码语言:javascript
复制
if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

抛开错误处理不谈,(为什么)这行得通吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-09-25 17:02:46

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

代码语言:javascript
复制
switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}
票数 20
EN

Stack Overflow用户

发布于 2008-09-25 16:58:42

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

此外,如果forking中存在错误,则返回-1,而您在这两种情况下都没有对其进行测试,这通常是错误的。

票数 4
EN

Stack Overflow用户

发布于 2008-09-25 16:59:28

您应该改为这样做。我从来不知道它不能工作。史蒂文斯的书里就是这么做的。

代码语言:javascript
复制
int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/134501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档