分类: C/C++
2012-11-09 14:11:57
{
pid_t pid;
if(pid=fork()<0)
{
printf("error!");
}
else
{
if(pid==0)
printf("a/n");
else
printf("b/n");
}
}
结果是返回a,b或者b,a
因为fork调用将执行两次返回分别从子进程和父进程返回
由于父进程和子进程无关,父进程与子进程都可能先返回
在看一个程序
main()
{
pid_t a_pid,b_fork;
if(a_pid=fork()<0)
{
printf("error!");
}
else
{
if(a_pid==0)
printf("b/n");
else
printf("a/n");
}
if(b_pid=fork()<0)
{
printf("error!");
}
else
{
if(b_pid==0)
printf("c/n");
else
printf("a/n");
}
}
如果是创建两个进程则出现结果
b
c
a
a
c
a
事实上,理解fork()的关键在于它的返回点在哪里。fork最特殊的地方就在于他有两个甚至三个返回值,注意是同时返回两个值。其中pid=0
的这个返回值用来执行子进程的代码,而大于0的一个返回值为父进程的代码块。第一次fork调用的时候生叉分为两个进程,不妨设为a父进程和b子进程。他
们分别各自在第二次fork调用之前打印了b和a各一次;在第一次叉分的这两个进程中都含有
if(b_pid=fork()<0)
{
printf("error!");
}
else
{
if(b_pid==0)
printf("c/n");
else
printf("a/n");
}
}
这段代码。很明显,a父进程和b子进程在这段代码中又各自独立的被叉分为两个进程。这两个进程每个进程又都打印了a,c各一次。到此,在程序中总共打印三次a两次c和一次b。总共6个字母。
注:在第一次叉分为两个进程的时候父子进程含有完全相同的代码(第二次仍然相同),只是因为在父子进程中返回的PID的值不同,父进程代码中的PID的值大于0,子进程代码中的值等于0,从而通过if这样的分支选择语句来执行各自的任务。
我做如下修改
结果是
[root@localhost c]# ./a.out
fork!i am the child process, my process id is 4286
fork!i am the parent process, my process id is 4285
但我改成printf("fork!n");后,结果是
[root@localhost c]# ./a.out
fork!
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
为什么只有一个fork!打印出来了?上一个为什么有2个?