管道和控制台的差异

时间:2020-05-05 22:09:39

标签: c linux process pipe

我有以下程序:

#include    <sys/types.h>
#include    "ourhdr.h"

int     glob = 6;       /* external variable in initialized data */
char    buf[] = "a write to stdout\n";

int
main(void)
{
    int     var;        /* automatic variable on the stack */
    pid_t   pid;

    var = 88;
    if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
        err_sys("write error");
    printf("before fork\n");    /* we don't flush stdout */

    if ( (pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0) {        /* child */
        glob++;                 /* modify variables */
        var++;
    } else
        sleep(2);               /* parent */

    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
    exit(0);
}

我无法解释在两次执行(带有和不带有重定向)的程序出口处发现的差异。

到目前为止,我了解的是缓冲到printf。但是,当我们将标准输出重定向到文件时,我们得到了printf行的两个副本。在第二种情况下,在printf之前的fork被调用一次,但是在调用fork时该行保留在缓冲区中。然后,在将父级的数据空间复制到子级时,将该缓冲区复制到子级中。第二个printf紧接在exit之前,仅将其数据附加到现有缓冲区中。

我最重要的问题是:在屏幕上书写(退出控制台)与在管道中书写时的区别?

1 个答案:

答案 0 :(得分:0)

当写入控制台时,标准C库会在每个换行符(也称为"\n")处刷新输出缓冲区。

对于任何其他设备,仅在缓冲区已满时才刷新输出。

您已正确:fork()复制了输出缓冲区。