LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1014|回复: 3

一个有关fprintf的疑问

[复制链接]
发表于 2006-11-1 10:22:44 | 显示全部楼层 |阅读模式
显示test1.c源代码
[root@localhost root]# cat test1.c
#include "selfdefine.h"

int     main()
{
        int     filedes,pid;
        char    *filename;

        close(1);
        filedes=open("linjunjie",O_RDWR|O_CREAT,0777);
        fprintf(stdout,"I love you:parapid1\n");
        if((pid=fork())==0)
        {
                fprintf(stdout,"I love you:childpid\n");
                exit(0);
        }
        fprintf(stdout,"I love you:parapid2\n");
}
运行由该源代码编译过的执行文件
[root@localhost root]# ./test
显示linjunjie文件内容:
[root@localhost root]# cat linjunjie
I love you:parapid1
I love you:childpid
I love you:parapid1
I love you:parapid2
疑问:为什么显示出来的结果不是
I love you:parapid1
I love you:childpid
I love you:parapid2
怎么多了一行I love you:parapid1,莫非这是由创建的子进程输出的
子进程应该是从fprintf(stdout,"I love you:childpid\n");开始执行,exit(0);退出
怎么可能跑到fprintf(stdout,"I love you:parapid1\n");执行语句去执行。
发表于 2006-11-1 20:41:29 | 显示全部楼层
你可以看一下unix环境高级编程里讲的关于fork的那一章,应该是第八章.看完你就知道了.呵呵
(以后代码要用code引用起来,要不真的很难看.)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-2 00:46:33 | 显示全部楼层
本来源代码中的那个图标是p,可是在这里发帖子的时候p却不知道
怎么变成了那个图标,影响大家看源代码,还望见谅!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-2 23:39:06 | 显示全部楼层
问题搞清楚了,标准I/O库是带缓存的,当调用fork时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在exit之前的第二个printf将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。=hB
所以应在fprintf(stdout,"I love you:parapid1\n");之后添加fflush(stdout);才可以
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表