首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在进程创建中,fork()!=0和!fork()有什么区别

在进程创建中,fork()!=0和!fork()有什么区别
EN

Stack Overflow用户
提问于 2012-08-05 23:09:19
回答 5查看 1.4K关注 0票数 1

目前,我正在做一些基于UNIX操作系统的练习。我使用fork()系统调用创建子进程,代码片段如下:

代码语言:javascript
运行
复制
if(!fork())
{
   printf("I am parent process.\n");
}
 else
   printf("I am child process.\n");

这个程序首先执行子进程,然后执行父进程。

但是,当我替换if(!fork()) by if(fork()!=0),然后是父块,然后是子块executes.Here时,我的问题是-这两种情况下的结果应该是相同的,还是有某种原因?提前感谢!!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-05 23:21:23

  • 不保证execution.
  • However,的顺序,if(fork()!=0)在逻辑上会给出与相反的结果:如果fork()返回0,则!fork()为真,而fork()!=0为假。<代码>H211<代码>F212

另外,从fork()的手册页:

如果成功,则在父进程中返回子进程的PID,在子进程中返回0。失败时,在父进程中返回-1,不创建子进程,并适当设置errno。

所以正确的检查是

代码语言:javascript
运行
复制
pid_t pid = fork();
if(pid == -1) {
     // ERROR in PARENT
} else if(pid == 0) {
     // CHILD process
} else {
     // PARENT process, and the child has ID pid
}

编辑:正如Wyzard所说,你应该确保以后也使用pid。(另外,将类型修复为pid_t而不是int。)

票数 3
EN

Stack Overflow用户

发布于 2012-08-05 23:22:47

您实际上不应该使用这两种方法中的任何一种,因为当子进程完成时,它将保持僵尸状态,直到父进程也完成。您应该在变量中捕获子进程的pid,并使用它来检索子进程的退出状态:

代码语言:javascript
运行
复制
pid_t child_pid = fork();
if (child_pid == -1)
{
  // Fork failed, check errno
}
else if (child_pid)
{
  // Do parent stuff...

  int status;
  waitpid(child_pid, &status, 0);
}
else
{
  // Child stuff
}

或者您应该使用"double-fork trick“来解除子进程与父进程的关联,这样子进程就不会像僵尸一样等待父进程恢复其退出状态。

此外,您不能依赖于在fork之后在父进程之前执行的子进程。您有两个并发运行的进程,不能保证执行的相对顺序。它们可以轮流运行,也可以在不同的CPU核心上同时运行。

票数 1
EN

Stack Overflow用户

发布于 2012-08-05 23:14:34

!fork()fork() == 0的行为方式相同。

条件本身不能成为执行顺序不同的原因。该过程被复制,这意味着子进程现在正在与父进程竞争资源,包括CPU。操作系统调度程序决定哪个进程将获得CPU。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11817501

复制
相关文章

相似问题

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