+ -
当前位置:首页 → 问答吧 → fork的问题

fork的问题

时间:2010-08-18

来源:互联网

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>

  4. int main(void)
  5. {
  6.         printf("one");
  7.         fork();
  8.         printf("two\n");

  9.         return 0;
  10. }
复制代码
结果是:
onetwo
onetwo

为什么printf("one")也执行了两遍?

作者: rainfly100   发布时间: 2010-08-18

没有人知道?

作者: rainfly100   发布时间: 2010-08-18

printf("one");
printf("two\n");

你是来没事找事的吧

作者: phy0077   发布时间: 2010-08-18

本帖最后由 davelv 于 2010-08-18 16:19 编辑

可能是IO缓冲的问题,我把第一个也加上换行符号结果就成了这样
[dave@dave ~]$ ./a.out
one
two
我再运行两下就恢复正常了
[dave@dave ~]$ ./a.out
one
two
two

作者: davelv   发布时间: 2010-08-18



QUOTE:
printf("one");
printf("two\n");

你是来没事找事的吧
phy0077 发表于 2010-08-18 16:17




    没有明白的意思

作者: rainfly100   发布时间: 2010-08-18

回复 rainfly100


    你把第一个printf改成
    fprintf(stderr,"one");
    试试

作者: chong232   发布时间: 2010-08-18



QUOTE:
可能是IO缓冲的问题,我把第一个也加上换行符号结果就成了这样
[dave@dave ~]$ ./a.out
one
two
davelv 发表于 2010-08-18 16:17




    加了换行符结果是:
one
two
two

按我对fork的理解这个才是正确的,就是不明白不加换行符,结果跟我想的不一样,我觉得应该是
onetwo
two

作者: rainfly100   发布时间: 2010-08-18

回复 rainfly100


    子进程继承了父进程的很多东西,包括还在缓冲区中的那个字符串“one”

作者: chong232   发布时间: 2010-08-18

我觉得可能是第一个printf把数据放入IO缓冲,而后被子进程继承了。
可以在第一个printf的后面加入fflush(stdout);来强制刷新缓存。
或者按照6楼所说的输出的stderr里面,stderr是不缓冲的。

作者: davelv   发布时间: 2010-08-18



QUOTE:
回复  rainfly100


    子进程继承了父进程的很多东西,包括还在缓冲区中的那个字符串“one”
chong232 发表于 2010-08-18 16:23




    哦,谢谢,那就是说没有加换行符,缓冲区就还有数据吧

作者: rainfly100   发布时间: 2010-08-18

大致知道了,谢谢各位

作者: rainfly100   发布时间: 2010-08-18

回复 rainfly100


    对,换行符可以清缓冲

作者: chong232   发布时间: 2010-08-18