重定向到文件时的不同输出

问题描述 投票:0回答:1

我有这个代码:

int main(void)
{
    int f;
    for (int i = 0; i < 2; i++)
    {
        fork();
        printf("hello\n");
    }
    wait(NULL);
    printf("hello\n");
    exit(0);
}

当我在终端中运行这段代码时,我会得到 10 行“hello”。

但是在将输出重定向到一个文件之后:

./test > file.txt
我在文件中得到 12 行“hello”。

为什么会有这种差异?

c linux bash redirect fork
1个回答
0
投票

因为你只是

fork
但不检查返回值(0执行子代码),你分叉比你想象的更多孩子。

父母也做

printf
not只是孩子。

并且,在第一个循环之后,第一个孩子also做了一个

fork
所以你有一个意想不到的孙子。

它也像父母和孩子一样,都打印出来。

所以,你从循环中得到 six 打印。

而且,因为有no

exit
调用在孩子们,他们“落空”并执行底部的父代码。

所以,在循环之后,你从代码中得到four打印。

而且,你应该在wait

loop
因为你
fork
two孩子但只做一个single
wait
.


添加一些

getpid
getppid
电话可以显示真正发生的事情:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define PRINT(_fmt) \
    printf("%d/%d " _fmt,getpid(),getppid())

int
main(void)
{
    int f;

    setlinebuf(stdout);

    for (int i = 0; i < 2; i++) {
        fork();
        PRINT("hello\n");
    }

    wait(NULL);
    PRINT("world\n");

    exit(0);
}

这里是输出:

242293/2809616 hello
242293/2809616 hello
242294/242293 hello
242294/242293 hello
242295/242293 hello
242295/242293 world
242296/242294 hello
242296/242294 world
242293/2809616 world
242294/2806078 world

这里是更正后的程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define PRINT(_fmt) \
    printf("%d/%d " _fmt,getpid(),getppid())

int
main(void)
{
    int f;

    setlinebuf(stdout);

    for (int i = 0; i < 2; i++) {
        if (fork() == 0) {
            PRINT("hello\n");
            exit(0);
        }
    }

    while (wait(NULL) >= 0);
    PRINT("world\n");

    exit(0);
}

程序输出如下:

242316/242314 hello
242315/242314 hello
242314/2809616 world
© www.soinside.com 2019 - 2024. All rights reserved.