V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mstar
V2EX  ›  问与答

waitpid 导致父进程读取最后一行数据两次的困惑

  •  
  •   mstar · 2017-07-08 18:13:26 +08:00 · 1595 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有如下代码 1.c:

    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/wait.h>
    
    int
    getcmd(char *buf, int nbuf)
    {
        memset(buf, 0, nbuf);
        fgets(buf, nbuf, stdin);
        if(buf[0] == 0)
            return -1;
        return 0;
    }
    
    int
    main(void)
    {
        static char buf[100];
        int r;
    
        while(getcmd(buf, sizeof(buf)) >= 0){
            printf("%s", buf);
            if(fork() == 0)
                return 0;
            wait(&r);
        }
        return 0;
    }
    
    

    以及 1.txt

    line1
    line2
    

    执行:

    gcc 1.c
    ./a.out < 1.txt
    

    输出

    line1
    line2
    line2
    

    求解为啥这里 line2 这一行会输出两次?其实我也在别的机器试过,发现有些机器就不会输出 2 次。

    5 条回复    2017-07-09 07:47:37 +08:00
    billlee
        1
    billlee  
       2017-07-08 18:33:56 +08:00
    使用未初始化的变量是未定义行为。
    billlee
        2
    billlee  
       2017-07-08 18:35:31 +08:00
    @billlee #1 看错了,忽略这条吧
    xenme
        3
    xenme  
       2017-07-08 19:43:14 +08:00 via iPhone
    应该是你 fork 后子进程执行了现实了 line2,结束之后父进程继续执行,然后又显示一行。
    你可以试试 1.txt 放三行是啥效果,估计会更奇怪
    mstar
        4
    mstar  
    OP
       2017-07-08 23:00:21 +08:00
    @xenme 为啥 fork 后子进程会执行显示 line2 ?
    msg7086
        5
    msg7086  
       2017-07-09 07:47:37 +08:00
    if(fork() == 0) return 0;
    这句是……啥意思?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2721 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.