UINX环境高级编程 第三版
#include<stdio.h>
int globvar =6;
char buf[] = "a write to stdout\n";
int main(void)
{
int var;
pid_t pid;
var = 88;
if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf) - 1)
err_sys("write error");
printf("before fork \n");
if((pid = fork()) < 0)
err_sys("fork error");
else if(pid == 0)
{
globvar++;
var++;
}
else
sleep(2);
printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
exit(0);
}
运行结果
a write to stdout
before fork
pid = 430, glob = 7, var = 89
pid = 429, glob = 6, var = 88
a.out > temp.out
运行结果
a write to stdout
before fork
pid = 432, glob = 7, var = 89
before fork
pid = 421, glob = 6, var = 88
1.write函数是不带缓冲的。因为在fork之前调用write,所以数据写到标准输出一次。但是,标准I/O库是带缓冲的。如果标准输出连接到终端设备,则它是行缓冲的;否则他是全缓冲的。 当以交互方式运行该程序时,只得到该printf的一次输出,其原因是标准输出缓冲区由换行符冲洗。但是将标准输出定向到一个文件的时候,输出printf确实两次,其原因是,在fork之前调用了一次printf,但当调用fork时候,该行数据还是在缓冲区,然后在将父进程数据空间复制到子进程的数据空间的时候,该缓冲区也被复制到子进程中,此时父进程和子进程都有带改行的缓冲区,在exit之前的第二个printf将该行追加到已有的缓冲区中。在进程结束时,其缓冲区的内容都被写到对应的文件中。