废话不多说 直接代码

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h> int globvar = 88;
char buf[] = "a write to stdout\n"; int main()
{
int var = 10;
pid_t pid ;
//write 该函数是不带缓冲区的非标准函数
if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1); //printf 带缓存区的 标准IO函数
printf("befor fork\n"); if( (pid = fork()) < 0 ){
}else if(pid == 0){
globvar++;
var++; }else{
sleep(2);
} printf("pid = %ld, glob = %d, var = %d\n",(long)getpid(),globvar, var); exit(0); }  

第一种情况

root@instance-ug0zl538:~/learing/4-2# ./fork
a write to stdout
befor fork
pid = 92706, glob = 89, var = 11
pid = 92705, glob = 88, var = 10

第二种情况

./fork > file

a write to stdout
befor fork
pid = 92714, glob = 89, var = 11
befor fork
pid = 92713, glob = 88, var = 10

为什么会这样呢 ?是不是 有点小意外  其实啦 没什么咯  很简单

write函数是不带缓冲区的   因为在fork之前 调用write 所以其数据  写到标准输出  只有一次。

但是标准IO函数是带缓存。 如果标准IO输出连接到终端设备,则它行缓冲的,否则是全缓冲。

所以当已交互式(连接到终端了嘛)方式运行时 printf函数只输出一行(行缓冲然后fork时没有用 只有一行),标准输出由换行符号冲洗。但当定向到一个文件时,却得到printf的两次输出,就这个很容易理解吗 (因为全部缓冲了嘛) 又加上fork的原因嘛

还是解释下吧  因为fork 复制了 父进程的 标准IO缓冲区   所以子进程也有了这些缓冲区的数据  然后在各自调用 第二个print的时候  会将其数据  追加到 缓冲区中去且带有行缓冲符号\n       最后调用 exit函数  进程终止  则会刷新缓冲区域

不理解 在看书  环境高级编程  p184

带标准IO带缓存区和非标准IO 遇到fork是的情况分析的更多相关文章

  1. IO模型《三》非阻塞IO

    非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...

  2. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  3. (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...

  4. 同步异步阻塞非阻塞Reactor模式和Proactor模式 (目前JAVA的NIO就属于同步非阻塞IO)

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  5. 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  6. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  7. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...

  8. IO复用\阻塞IO\非阻塞IO\同步IO\异步IO

    转载:IO复用\阻塞IO\非阻塞IO\同步IO\异步IO 一. 什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述符时(例如服务器程序要同 ...

  9. 阻塞IO、非阻塞IO的区别

    1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类(抽象类)的实现. 3)继承 ...

随机推荐

  1. 列表推导式对比For循环执行效率

    我们在前面的学习中都知道,如果把1-10以内的元素追加到一个新的列表表中,如果使用for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) prin ...

  2. What is difference between 3-layer architecture and MVC architecture?

    By Vikas Singh on Sep 26, 2014 In 3-layer architecture  3-layer architecture separates the applicati ...

  3. sql 与 oracle 几个简单语法差别

    sql 与 oracle 之间的 语法差别. 简单的几个函数转换 sql->  Up_Time=getdate(),  isnull(), substring(),  charindex(), ...

  4. [.net 多线程]SpinWait

    <CLR via C#>读书笔记-线程同步(四) 混合线程同步构造简介 之前有用户模式构造和内核模式构造,前者快速,但耗费CPU:后者可以阻塞线程,但耗时.耗资源.因此.NET会有一些混合 ...

  5. 父级(display:none)隐藏时,子节点的高度获取。

    当父节点display:none的时候,子节点的高度是0获取不到. 解决办法:用visibility替换display就可以了.

  6. 获取oracle 库所有表名

    (mybatis多参)

  7. UIButton的几种触发方式

    1.说明 说明:由于是在"iOS 模拟器"中测试的,所以不能用手指,只能用鼠标. 1)UIControlEventTouchDown 指鼠标左键按下(注:只是"按下&qu ...

  8. linux获取域名地址

    dig live-195887137.cn-north-1.elb.amazonaws.com.cn +short

  9. js创建ActiveXObject无效

    是因为使用的浏览器不是ie内核的,比如用搜狗浏览器,切换为兼容模式就正常了

  10. 在CentOS-6.3环境下,利用grub工具手工制作Linux U盘安装盘

    注:此文是本人亲自操作实现后写的心得,同时也是对自己操作的记录. 制作的全过程概况 准备工作: U盘重新分区: 格式化U盘: 安装grub文件到U盘特定的分区: 拷贝镜像中的相关文件到U盘: 安装时设 ...