对你们大多数人来说可能看起来很幼稚,但我无法理解这一小段代码。
#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
答案 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
。