为什么输出打印两次?

时间:2010-09-29 14:45:35

标签: c fork wait

对你们大多数人来说可能看起来很幼稚,但我无法理解这一小段代码。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char** argv) {
    int i, pid;
    pid = fork();
    printf("Forking the pid: %d\n",pid);
    for(i =0; i<5; i++)
        printf("%d  %d\n", i,getpid());
    if(pid)
        wait(NULL);
    return (0);
}

这个程序的输出是

Forking the pid: 2223
0  2221
1  2221
2  2221
3  2221
4  2221
Forking the pid: 0
0  2223
1  2223
2  2223
3  2223
4  2223
Press [Enter] to close the terminal ...

在for循环中,printf命令使用一次。为什么“分叉pid”,然后将pid打印两次。这是怎么回事?谁能解释一下这个?提前致谢。 谁能解释一下我们为什么要在这里等待?我从手册页中了解到的是等待将控件重新调整为父进程?我理解的是正确的吗?是否有必要在分拣过程后使用等待? 操作系统:ubuntu,编译器:gcc,IDE:netbeans

5 个答案:

答案 0 :(得分:3)

fork()调用会产生一个新进程。然后从2个进程中的每个进程执行其余代码。 (Man page)

答案 1 :(得分:3)

但那'正是fork所做的。在fork完成两次之后,您将进程和所有内容分叉,因为现在您有两个进程执行相同的打印代码。你基本上问为什么fork分叉。 fork分叉,因为它应该是分叉的。这就是它的用途。

fork之后,父进程和子进程通常并行执行 ,这意味着您在示例中看到的顺序输出不能得到保证。您可能很容易从两个进程中获得行交错输出。

您的案例中的

wait函数仅从父进程执行。它使它等到子进程终止,并且只有在此之后父进程也继续终止。在这个特定的例子中调用wait并不是很关键,因为程序在此之后什么都不做,它只是终止。但是,例如,如果您希望从子进程收到一些反馈到父进程,并在父进程中对该反馈做一些额外的工作,则必须使用wait等待子进程完成执行。

答案 2 :(得分:1)

您正在两个流程中打印。将您的打印循环放在else

if (pid)子句中
pid = fork();
if(pid)
{
    printf("Child pid: %d\n",pid);
    wait(NULL);
}
else
{
    for(i =0; i<5; i++)
        printf("%d  %d\n", i,getpid());
}

你看,fork返回两次,一次在父进程中,一次在子进程中。它在子节点中返回0,在父节点中返回已创建进程的pid。

答案 3 :(得分:0)

因为父进程和子进程都在输出结果。

请参阅此处:http://en.wikipedia.org/wiki/Fork_(operating_system)#Example_in_C以获得一个好例子。

答案 4 :(得分:0)

fork创建一个新进程,并在旧进程(父进程)和新进程(子进程)中返回。

您可以通过查看fork的返回值来判断您所在的人。在父进程中,它返回子进程的PID。在子进程中,它返回0