当前位置: 技术问答>linux和unix
请教fork的一个问题
来源: 互联网 发布时间:2016-12-16
本文导语: #include "apue.h" int glob=6; char buf[]="a write to stdoutn"; int main(int argc, char *argv[]) { int var ; pid_t pid; var=88; if( write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1 ) perror("write error"); printf(...
#include "apue.h"
int glob=6;
char buf[]="a write to stdoutn";
int main(int argc, char *argv[])
{
int var ;
pid_t pid;
var=88;
if( write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1 )
perror("write error");
printf("befor forkn");
if( (pid=fork()) temp.out
$ cat temp.out
a write to stdout
befor fork
pid=3677, glob=7, var=89
after fork
befor fork
pid=3676, glob=6, var=88
after fork
int glob=6;
char buf[]="a write to stdoutn";
int main(int argc, char *argv[])
{
int var ;
pid_t pid;
var=88;
if( write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1 )
perror("write error");
printf("befor forkn");
if( (pid=fork()) temp.out
$ cat temp.out
a write to stdout
befor fork
pid=3677, glob=7, var=89
after fork
befor fork
pid=3676, glob=6, var=88
after fork
|
会不会是重定向的时候 会把printf的缓冲去先存着不打印,结果fork的时候就复制到子进程去了,
结果就打印了两次。
结果就打印了两次。
|
正解
这是apue里面的程序
我刚才也干好运行过这个程序,也想到论坛问这个问题,不过往下看书上有解释。
|
“printf("befor forkn");”写在“fork()”之前时,“before fork”就是只输出一次。
当“printf("befor forkn");”在fork()后执行,例如在“printf("pid=%d, glob=%d, var=%dn",getpid(),glob,var);”之前时,会输出两次。
我最近也在学习c,刚好看到这里,作为个初学者,根本上的原因我就回答不了了,期待高人出现。
当“printf("befor forkn");”在fork()后执行,例如在“printf("pid=%d, glob=%d, var=%dn",getpid(),glob,var);”之前时,会输出两次。
我最近也在学习c,刚好看到这里,作为个初学者,根本上的原因我就回答不了了,期待高人出现。
|
想起来了,以前也看过这段,不重定向的时候是行缓冲模式,加n就会输出,但是重定向以后就变成页缓冲
只有在页满或者程序结束才会输出
|
如果标准输出连到终端设备,则它是行缓冲,否则是全缓冲。当以交互方式运行该程序时,只得到该printf输出的行一次,其原因是标准输出的缓冲区由换行符冲洗。但是当将标准输出重定向到一个文件是,却得到printf输出行两次。其原因是,在fork之前调用了printf一次,但当调用fork时,该行数据仍在缓冲区中,然后在将父进程数据空间复制到子进程中时,该缓冲区也被复制到了子进程中。于是那时父子进程各自有了带改行内容的标准I/O缓冲区。