免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2442 | 回复: 8
打印 上一主题 下一主题

[C] fork子进程的PC在哪?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-09 20:30 |只看该作者 |倒序浏览
#include int main(void) { int p1; putchar('x'); while((p1=fork())==-1); if(p1==0) printf("b"); else printf("a"); printf("y"); }



请问fork后的子程序从哪里开始执行。

结果不是xxbyay,而是xbyxay,为什么呀。。

不是要先执行父进程,在创建子进程之前选输出x,接着子进程输出xby,再父进程输出ay..


请说一下这个程序的执行过程。。

论坛徽章:
0
2 [报告]
发表于 2009-11-09 21:36 |只看该作者

回复 #1 zengmao 的帖子

因为标准输出是line buffered
程序真正分支的开始是fork以后的代码,第一个x其实是在buffer里面(这个时候还没有子进程父进程的概念),fork的时候子进程也拷贝了一份父进程的buffer,所以子进程会得到x。xby一定是连在一起的,因为标准输出默认是line buffered,没有遇到回车是不会输出东西的,只有在进程退出的时候才会将buffer清空。同理xay也一定是在一起的。
至于xay和xby的先后顺序是不能确定的。

如果你先fflush了的话就会少个x了

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. int main( void )
  5. {
  6.   int p1;

  7.   putchar( 'x' );
  8.   fflush( stdout );
  9. //setbuf(stdout,NULL);
  10.   while( ( p1 = fork(  ) ) == -1 );
  11.   if( p1 == 0 )
  12.     printf( "b" );
  13.   else
  14.     printf( "a" );
  15.   printf( "y" );
  16.   return 0;
  17. }
复制代码

这样出来的结果就是
xbyay

还是那句话,由于stdout默认是line buffered,所以by一定是连在一起的(只有在子进程退出的时候才会flush掉),ay同理也是连在一起的。至于ay,by的先后顺序是不一定的

[ 本帖最后由 churchmice 于 2009-11-9 21:40 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-11-09 21:39 |只看该作者

回复 #2 churchmice 的帖子

学习了`

论坛徽章:
0
4 [报告]
发表于 2009-11-09 21:45 |只看该作者
代码好乱。。

输出应该是: xayxby  或者 xbyxay

fork后父子进程都可以执行,不一定那个先。。
x 本来应该输出一次的, 由于缓存的原因 x 输出了两次,可以setvbuf把缓存设为零看效果, 也可以 putchar 后 fflush

论坛徽章:
0
5 [报告]
发表于 2009-11-09 21:47 |只看该作者
我晕, 我写完已经有人回答了。。。。

论坛徽章:
0
6 [报告]
发表于 2009-11-09 21:51 |只看该作者

回复 #5 angle4 的帖子

真是不好意思啊

论坛徽章:
0
7 [报告]
发表于 2009-11-09 22:05 |只看该作者
汗, 都是助人为乐哈

论坛徽章:
0
8 [报告]
发表于 2009-11-10 06:57 |只看该作者
原帖由 zengmao 于 2009-11-9 20:30 发表
#include int main(void) { int p1; putchar('x'); while((p1=fork())==-1); if(p1==0) printf("b"); else printf("a"); printf("y"); }


请问fork后的子程序从哪里开始执行。

结果不是xxbyay,而是x ...


子进程从fork里面开始执行

[ 本帖最后由 huangwei0413 于 2009-11-10 06:59 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-11-10 09:36 |只看该作者
谢谢了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP