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

2017-07-08 18:13:26 +08:00
 mstar

有如下代码 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 次。

1617 次点击
所在节点    问与答
5 条回复
billlee
2017-07-08 18:33:56 +08:00
使用未初始化的变量是未定义行为。
billlee
2017-07-08 18:35:31 +08:00
@billlee #1 看错了,忽略这条吧
xenme
2017-07-08 19:43:14 +08:00
应该是你 fork 后子进程执行了现实了 line2,结束之后父进程继续执行,然后又显示一行。
你可以试试 1.txt 放三行是啥效果,估计会更奇怪
mstar
2017-07-08 23:00:21 +08:00
@xenme 为啥 fork 后子进程会执行显示 line2 ?
msg7086
2017-07-09 07:47:37 +08:00
if(fork() == 0) return 0;
这句是……啥意思?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX