废话不多说 直接代码
#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