apue有点激动的写下这个大神的东东,膜拜您啊!!
2013-04-16 11:02
387 查看
#include <unistd.h> #include <stdio.h> int glob = 6; char buf[] = "a write to stdout\n"; int main() { int var; pid_t pid; var = 88; if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1) printf("%m\n"), exit(-1); printf("before fork\n");//1 if ((pid = fork()) < 0) { printf("%m\n"), exit(-1); } else if (pid == 0) { glob++; var++; } else { sleep(2); } printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);//2 exit(0); }
我在这里拼命的呐喊,是因为,这个例子真的很好。我的着眼点不是最后一个printf//2,而是printf//1.
我直接进入重点:
./a.out得到的输出结果是:
a write to stdoutbefore fork
pid = 430, glob = 7, var = 89
pid = 429, glob = 6, var = 88
./a.out > 1.txt的输出结果是:
a write to stdoutbefore fork
pid = 430, glob = 7, var = 89
before fork
pid = 429, glob = 6, var = 88
分析:
在我机器上也有这个结果,当然pid不同。1,为什么write没有打印两次呢?
因为write是没有缓冲的,所以,直接就flush掉喽~2,为什么./a.out>1会多打印一行printf的内容呢?
因为printf因时而变,当是输出到终端的话,那么就是行缓冲,flush掉喽~如果输出到文件则是全缓冲,则fork的时候也会把这部分缓冲内容复制到子进程中喽~
或者,你把printf//1从
printf("before fork\n");//1改为:
printf("before fork");//1也可以得到重定向到文件的类似效果。
相关文章推荐
- 虫洞语音助手:这个助手有点冷
- 模拟赛 cf#304div2 D.Soldier and Number Game ,人生中第一次在比赛中A掉D题,好吧我承认这个D题有点水
- 这个通知有点烦
- 膜拜了武大Eyelids大神的BLOG后,补得 Codeforces Round #226 (Div. 2)两道题。。。
- 这个图像处理,把电脑直接卡死,求解各路大神的优化方法
- 这个是什么错误,求大神解答
- 这个是什么错误,求大神解答
- 这个是什么错误,求大神解答
- 这个是什么错误,求大神解答
- redis是个单线程的程序,为什么会这么快呢?每秒10000?这个有点不解,具体是快在哪里呢?EPOLL?内存?
- 为什么两次调用同一函数, 输入相同, 输出却不同呢? (解决困扰自己好几天的问题, 还是有点激动哈, 奖励自己一顿丰厚的晚餐)
- 验证哥德巴赫猜想(好难啊,感觉自己写的有点啰嗦,求大神指点!!!)
- 机器视觉的大神-膜拜
- 这个十一有点冷
- 侃侃底层rfc协议这个跳不出的东东
- 最近在学这个东东,高端大气上档次
- 【一个男人娶了四个妻子。临终时却。。。【这个故事有点深度。其实人人都是这样。。但现实中我们往往忽略真正意义上的东西】
- 有点兴奋,有点激动
- 这个程序中为什么出错???为什么不能把nl,nr定义为全局变量,求大神指教
- 2014第一篇之膜拜鑫神搜索大神之CF的C题