#include <unistd.h>
#include <stdio.h>
int main(void)
{
char buf[]="a write to stdout/n";
pid_t pid;
if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1) perror("write wrong!");
printf("before fork!/n");
if((pid=fork())<0) perror("fork wrong!");
else if(pid==0) ;
else sleep(2);
printf("pid=%d/n",getpid());
exit(0);
}
./a.out的输出
a write to stdout
before fork
pid=345
pid=344
而./a.out>tmp.out
cat tmp.out查看结果却是
a write to stdout
before fork
pid=455
before fork
pid=454
多了个before fork你知道问什么吗?
要注意fork与IO函数之间的关系。标准IO库是带有缓冲的。如果标准输出连接到终端设备,则他是行缓冲的,否则他是全缓冲的。当以交互方式运行该程序时,只得到printf输出地行一次,其原因是标准输出缓冲区由换行符冲洗。但是当将标准输出重定向一个文件时,该缓冲区也被复制到子进程中。那时父子进程各自有了个该该行内容的标准IO缓冲区。在exit之前的第二个Printf将其数据添加到现有的缓冲区中。