目前,我正在做一些基于UNIX操作系统的练习。我使用fork()系统调用创建子进程,代码片段如下:
if(!fork())
{
printf("I am parent process.\n");
}
else
printf("I am child process.\n");
这个程序首先执行子进程,然后执行父进程。
但是,当我替换if(!fork()) by if(fork()!=0
),然后是父块,然后是子块executes.Here时,我的问题是-这两种情况下的结果应该是相同的,还是有某种原因?提前感谢!!
发布于 2012-08-05 23:21:23
if(fork()!=0)
在逻辑上会给出与相反的结果:如果fork()
返回0,则!fork()
为真,而fork()!=0
为假。<代码>H211<代码>F212另外,从fork()的手册页:
如果成功,则在父进程中返回子进程的PID,在子进程中返回0。失败时,在父进程中返回-1,不创建子进程,并适当设置errno。
所以正确的检查是
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。)
发布于 2012-08-05 23:22:47
您实际上不应该使用这两种方法中的任何一种,因为当子进程完成时,它将保持僵尸状态,直到父进程也完成。您应该在变量中捕获子进程的pid,并使用它来检索子进程的退出状态:
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核心上同时运行。
发布于 2012-08-05 23:14:34
!fork()
和fork() == 0
的行为方式相同。
条件本身不能成为执行顺序不同的原因。该过程被复制,这意味着子进程现在正在与父进程竞争资源,包括CPU。操作系统调度程序决定哪个进程将获得CPU。
https://stackoverflow.com/questions/11817501
复制相似问题