免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3075 | 回复: 13

[函数] fork()的诡异谁懂? [复制链接]

论坛徽章:
0
发表于 2012-09-27 11:59 |显示全部楼层
今日在学习linux进程方面的编程,抄写了一个小程序,当场被“吓”得“语无伦次”,且看源程序:
/*fork.c*/
#include<stdio.h>
#include<unistd.h>
int main(void) {
      for(int i =0; i < 2; ++i) {
               int j = fork();
               printf("- %4d %4d", i, j);
      }
}
进行编译运行的结果:
[root@centos testfork]# gcc -Wall -std=c99 fork.c
[root@centos testfork]# ./a.out
-    0 3724  -    1 3725  [root@centos testfork]# -    0 3724  -    1    0  -    0    0  -    1 3726  -    0    0  -    1    0  

/*forkn.n*/
#include<stdio.h>
#include<unistd.h>
int main(void) {
      for(int i =0; i < 2; ++i) {
               int j = fork();
               printf("- %4d %4d\n", i, j);
      }
}
进行编译运行的结果:
[root@centos testfork]# gcc -Wall -std=c99 forkn.c
[root@centos testfork]# ./a.out
-    0 3792
-    1 3793
[root@centos testfork]# -    0    0
-    1    0
-    1 3794
-    1    0
一个是“-”八次输出,一个是“-”六次输出、、、、、求大侠指点

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2012-09-27 12:04 |显示全部楼层
你看我行 发表于 2012-09-27 11:59
今日在学习linux进程方面的编程,抄写了一个小程序,当场被“吓”得“语无伦次”,且看源程序:
/*fork.c* ...

行缓冲的话
不加\n
fork的时候,子进程的标准输出缓冲区依然有数据

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2012-09-27 12:12 |显示全部楼层
回复 2# cjaizss

我也是这么想的,但我用笔画了一下,应该输出8次呀,难道我算错了,fork真难算

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2012-09-27 12:16 |显示全部楼层
bruceteen 发表于 2012-09-27 12:12
回复 2# cjaizss

我也是这么想的,但我用笔画了一下,应该输出8次呀,难道我算错了,fork真难算

呵呵,反正LZ要知道的只是原因,偶把原因告诉他就成了啊。

论坛徽章:
0
发表于 2012-09-27 12:19 |显示全部楼层
bruceteen 发表于 2012-09-27 12:12
回复 2# cjaizss

我也是这么想的,但我用笔画了一下,应该输出8次呀,难道我算错了,fork真难算



可能是某些其它条件引起的数据刷出缓冲区,所以导致没有8次。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-09-27 12:40 |显示全部楼层
回复 2# cjaizss


    lw v5,8741

....
XML elements are case sensitive. The element <Childelement2> is different from the element <childelement2>. Opening and closing elements are required to be written with same case.

Example 10.1 Camel Case XML Element<CamelCaseElement>Element</CamelCaseElement>
         
Example 10.2 Lower Case XML Element<lowercaseelement>Element</lowercaseelement>       
       

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-09-27 12:46 |显示全部楼层
回复 3# bruceteen


    第一个是八次啊。

第二个六次是因为terminal的stdout默认行缓冲的,你重定向一下就明白了。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2012-09-27 13:05 |显示全部楼层
回复 2# cjaizss


is it the fork() function copy the inputbuffer

  1. void main(){
  2.   printf("buffer");
  3.   fork();
  4.   puts("");
  5. }
复制代码
what the output is?
1.
buffer

2.
buffer
buffer

论坛徽章:
0
发表于 2012-09-27 13:18 |显示全部楼层
的确是这样     

论坛徽章:
0
发表于 2012-09-27 13:19 |显示全部楼层
得在大脑里绕      
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP