有个关于FORK函数的问题

jiangdamalong 2006-05-27 05:17:30
先看一个程序
main()
{
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
为什么会返回6个字母???????????
...全文
354 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
anguxiang 2006-05-27
  • 打赏
  • 举报
回复
事实上,理解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这样的分支选择语句来执行各自的任务。
jiangdamalong 2006-05-27
  • 打赏
  • 举报
回复
理论上是返回4个字符啊
linaxing 2006-05-27
  • 打赏
  • 举报
回复
果然是个经典问题,论坛里已经有过好多这样的问题了。
NC 2006-05-27
  • 打赏
  • 举报
回复
作业题自己做

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧