红联Linux门户
Linux帮助

请教一个fork的问题

发布时间:2011-07-13 22:54:38来源:红联作者:beyondncz
#include "apue.h"
int glob=6;
char buf[]="a write to stdout\n";
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 fork\n");
if( (pid=fork())<0 )
{
perror("fork error");
}
else if(pid==0)
{
glob++;
var++;
}
else
{
sleep(2);
}
printf("pid=%d, glob=%d, var=%d\n",getpid(),glob,var);
printf("after fork\n");
return 0;
}

// 执行结果
$ a.out
a write to stdout
befor fork
pid=3675, glob=7, var=89
after fork
pid=3674, glob=6, var=88
after fork

//为什么执行后 befor fork输出2次 而上面的只输出一次
$ a.out > 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
文章评论

共有 5 条评论

  1. D调漫步 于 2011-08-06 09:38:58发表:

    路过

  2. wenhao1129 于 2011-08-02 20:44:28发表:

    我是来帮顶的

  3. farell 于 2011-08-02 17:20:49发表:

    看了你的头文件,就知道你程序出自哪里了,书上解释很清楚

  4. 绿色圣光 于 2011-07-15 13:02:42发表:

    我错了。

    引用:
    w r i t e函数是不带缓存的。因为在f o r k之前调用w r i t e,所以其数据写到标准输出一次。但是,标准 I / O库是带缓存的。回忆一下5 . 1 2节,如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。当以交互方式运行该程序时,只得到p r i n t f输出的行一次,其原因是标准输出缓存由新行符刷新。但是当将标准输出重新定向到一个文件时,却得到p r i n t f输出行两次。其原因是,在f o r k之前调用了p r i n t f一次,但当调用f o r k时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在 e x i t之前的第二个p r i n t f将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。

  5. 绿色圣光 于 2011-07-14 09:10:52发表:

    不清楚,后面的那俩befor fork都是父进程输出的,怎么会输出两遍呢?