我通过搜索找到了这个样本。 乍一看,我认为只有第一个fork()会根据IF条件执行,但实际上两个fork()调用都会被执行。 如果fork()命令更改为简单的布尔比较(如(x == 10)),则IF条件的行为与预期的一样。
fork()导致IF条件表现不同的原因是什么?
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pid_t whichone, first, second;
int howmany;
int status;
int x = 0
if ((first=fork())==0) /* Parent spawns 1st child */
{
printf("Hiya, I am the first child nd my id is %d\n", getpid());
sleep(10);
exit(0);
}
else if (first == -1)
{
perror("1st fork: something went bananas\n");
exit(1);
}
else if ((second=fork())==0) /* Parent spawns 2nd child */
{
printf("Hiya, I am the second child and my id is %d\n", getpid());
sleep(15); /* Sleep 15 sec, then exit */
exit(0);
}
else if (second == -1)
{
perror("2nd fork: something went bananas\n");
exit(1);
}
printf("This is the parent\n");
howmany=0;
while (howmany < 2) /* Wait twice */
{
whichone=wait(&status);
howmany++;
if (whichone==first)
printf("First child exited ");
else
printf("Second child exited ");
if ((status & 0xffff)==0)
printf("correctly\n");
else
printf("uncorrectly\n");
}
return 0;
这是执行时的输出。请注意,两个fork()调用都已处理。
> runtThis
Hiya, I am the first child, and my id is 31204
Hiya, I am the second child, and my id is 31205
This is the parent
First child exited correctly
Second child exited correctly
答案 0 :(得分:0)
第一个if
检测它是否在孩子中运行。如果它不是,但fork()
没有失败(即,它没有返回-1),它在原始过程中,然后可以继续并调用再次fork()
。
不确定是什么混淆。
答案 1 :(得分:0)
fork()
函数复制当前进程,然后在两个进程中返回 。因此,有效地,fork()
函数返回两次。
在新流程中,fork()
返回值0
,这会导致相关分支打印&#34;我是孩子&#34;被采取
在原始过程中,fork()
返回非零值,表示失败(如果为负)或新进程的进程ID(如果为正)。由于此值不为零,因此跳转到下一个else if
并执行该测试,直到成功为止。
在父进程中,if
/ else if
测试都不会成功,但每个fork
调用都会导致创建一个新进程,相应的测试成功并且这会产生你注意到的效果。