zoukankan      html  css  js  c++  java
  • 带标准IO带缓存区和非标准IO 遇到fork是的情况分析

    废话不多说 直接代码

    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<stdlib.h>
    
    
    int globvar = 88;
    char buf[] = "a write to stdout
    ";
    
    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
    ");
    
    	if( (pid = fork()) < 0 ){
    	}else if(pid == 0){
    		globvar++;
    		var++;
    
    	}else{
    		sleep(2);
    	}
    
    	printf("pid = %ld, glob = %d, var = %d
    ",(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的时候  会将其数据  追加到 缓冲区中去且带有行缓冲符号        最后调用 exit函数  进程终止  则会刷新缓冲区域  

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

  • 相关阅读:
    Java 中的 volatile 关键字
    Java 隐式锁
    导致并发程序出问题的根本原因是什么?
    BZOJ_2434_[Noi2011]阿狸的打字机_AC自动机+出栈入栈序+树状数组
    BZOJ_5368_[Pkusc2018]真实排名_组合数
    CF上的3道小题(2)
    BZOJ_4199_[Noi2015]品酒大会_后缀自动机
    BZOJ_4566_[Haoi2016]找相同字符_后缀自动机
    BZOJ_3172_[Tjoi2013]单词_后缀自动机
    BZOJ_3998_[TJOI2015]弦论_后缀自动机
  • 原文地址:https://www.cnblogs.com/zhangkele/p/10645156.html
Copyright © 2011-2022 走看看