免费注册 查看新帖 |

Chinaunix

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

[Linux] 两个关于fork的程序,把我折磨惨了,help [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-08 17:07 |只看该作者 |倒序浏览
  1. [oracle@localhost ~]$ cat test_fork.c
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.         printf("hello!");
  6.         int i;
  7.         i = fork();
  8.         printf("aaa\n");

  9.         return 0;
  10. }

  11. [oracle@localhost ~]$ gcc test_fork.c
  12. [oracle@localhost ~]$ ./a.out
  13. hello!aaa
  14. hello!aaa
  15. [oracle@localhost ~]$
复制代码
  1. [oracle@localhost ~]$ cat basic_pro.c
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.         printf("aaa\n");
  6.         int i;
  7.         i = fork();
  8.         printf("i = %d\n", i);

  9.         return 0;

  10. }
  11. [oracle@localhost ~]$ gcc basic_pro.c
  12. [oracle@localhost ~]$ ./a.out
  13. aaa
  14. i = 0
  15. i = 4006
  16. [oracle@localhost ~]$
复制代码
我的疑惑是,为什么第一个程序中的printf("hello!");执行了两次,而第二个程序中的printf("aaa\n");执行了一次?!

fork不是建立了基本相同的进程吗?所以,我认为main函数里的第一个printf语句,无论在父进程还是子进程里面,都应该执行一次才对啊?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2013-11-08 17:21 |只看该作者
因为printf指向标准输出,标准输出与终端交互时为行缓存。
第一个程序:printf("hello!")执行后,内容保留在标准输出的缓存中,fork后子进程也有一份“hello”
第二个程序:printf("aaa\n")执行后,标准输出缓存已经为空,fork后子进程不包含“aaa”,简单说就是\n导致行缓存刷新

论坛徽章:
0
3 [报告]
发表于 2013-11-08 17:27 |只看该作者
timespace 发表于 2013-11-08 17:21
因为printf指向标准输出,标准输出与终端交互时为行缓存。
第一个程序:printf("hello!")执行后,内容保留 ...


“行缓存”啊?   第一次听说,看来需要学的东西太多了。

那这样说吧,由于调用fork而产生的子进程,会不会执行代码中fork调用之前的语句呢?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2013-11-08 17:57 |只看该作者
回复 3# 耐心学习
fork后还是正常语句执行,不可能执行以前的语句。缓存的仅是数据,不会有不符合逻辑的代码执行。看下《UNIX环境高级编程》讲述的关于IO的几章,看完就明白了。


   

论坛徽章:
0
5 [报告]
发表于 2013-11-08 22:21 |只看该作者
printf("hello!") 修改成printf("hello!\n") 或者 在printf("hello!") 之后加上 fflush(stdout);
就会只输出一个。

论坛徽章:
0
6 [报告]
发表于 2013-11-09 10:20 |只看该作者
谢谢各位了!

论坛徽章:
0
7 [报告]
发表于 2013-11-12 20:34 |只看该作者
楼上正解啊,又学了一招
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP