标准IO缓冲与fork问题

本文探讨了系统函数read和write的无缓冲特性与C标准IO函数的缓冲机制。当IO与stderr关联时,无缓冲;与stdin和stdout关联时,行缓冲;其他情况则为全缓冲。通过示例说明,当使用fork时,缓冲区会被复制,导致输出差异。例如,printf在行缓冲和全缓冲环境中的不同表现。
摘要由CSDN通过智能技术生成

系统函数read和write是不带缓冲的,而c的标准io函数是带缓冲的,

(1)当io函数与stderr相连时 是不带缓冲的(为了错误能够快速输出)

(2)当与stdin和stdout相连是行缓冲的(即遇到换行符就输出)

(3)与其他的相连都是全缓冲的(缓冲区满了才输出)

可以用一个小例子试一下,参考 《unix环境高级编程》 8.1

# include <stdio.h>
# include <apue.h>
int globvar = 6;
char buf[] = "a write to stdtou\n";


int main(){
    int var;
    pid_t pid;


    var = 88; 
    char *ma_buf = (char *) malloc(100);
    strcpy(ma_buf,"hahahaha");
    if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1)
        err_sys("write error");
    printf("before fork _huanhang\n");
    printf("before fork :");


    if( (pid = fork()) < 0 ){
        err_sys("fork error");
    } else if(pid == 0){ 
        var = 88; 
        globvar ++; 
        printf("child: ma_buf = %s\n",ma_buf);
    } else {
        sleep(2);
        printf("parent: ma_buf = %s\n",ma_buf);
    }   


    printf("pid = %ld, globvar = %d, var = %d\n",(long)getpid(),globvar,var);


}

结果:

ncx@ncx-tp:~/code$ gcc 8_1.c 
<strong>ncx@ncx-tp:~/code$ ./a.out   //  1</strong>
a write to stdtou
before fork _huanhang<span style="white-space:pre">	</span>
before fork :child: ma_buf = hahahaha
pid = 20593, globvar = 7, var = 88
before fork :parent: ma_buf = hahahaha
pid = 20592, globvar = 6, var = 88
<strong>ncx@ncx-tp:~/code$ ./a.out > tmp   // 2
ncx@ncx-tp:~/code$ cat tmp</strong>
a write to stdtou
before fork _huanhang
before fork :child: ma_buf = hahahaha
pid = 20595, globvar = 7, var = 88
before fork _huanhang
before fork :parent: ma_buf = hahahaha
pid = 20594, globvar = 6, var = 88

write 不带缓冲所以1 2都指数出一次

printf “before fork _huanhang”在1中与终端stdout相连是行缓冲的,所以在1中只输出一次

而在2中是与tmp相连的是全缓冲的,fork之后会把缓冲区一起复制,所以before fork _huanhang会输出两次

printf “before fork”因为没有遇到换行符 所以在1,2中都输出两次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值