在C中使用fork()和write()的打印行为

时间:2018-04-09 22:53:11

标签: c fork

在以下程序中,调用fork()并创建一个子节点。我知道在printf()中使用缓冲输出时会有不可预测的输出。为了解决这个问题,我使用的是write(),它是无缓冲的。

问题是write()不会将\ n与字符串一起打印。

我已经尝试过使用setvbuf()来禁用缓冲的stdout,就像其他帖子一样,我也尝试过使用fflush(stdout)。但输出总是一样的。

当我将输出重定向到像这样的文件时

./main.out > output.txt

输出看起来不错。我理解这是有效的,因为在将输出重定向到文件时,系统通过缓冲整个输出来完成它,而不仅仅是行缓冲。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

#define NO_ERROR 0
#define BUFFER_SIZE 50

void childProcess();
void parentProcess();

int main(int argc, char * argv[])
{
    int pid = (int) fork();

    if(pid < 0)
    {
        puts("Error: Fork process failed");
    }
    else if (pid == 0)
    {
        childProcess();
    }
    else
    {
        parentProcess();
    }

    return NO_ERROR;
}


void childProcess()
{
    char buffer[BUFFER_SIZE];
    int pid = (int) getpid();
    sprintf(buffer, "This line is from Child pid %d\n", pid);
    write(1, buffer, strlen(buffer));
}

void parentProcess()
{
    char buffer[BUFFER_SIZE];
    int pid = (int) getpid();
    sprintf(buffer, "This line is from Parent pid %d\n", pid);
    write(1, buffer, strlen(buffer));
}

Cygwin中的输出如下所示:(输出后还会打印1或2个新行)

This line is from Parent pid 20016This line is from Child pid 11784

预期产出:

This line is from Parent pid 20016
This line is from Child pid 11784

在另一台机器上测试,运行linux。输出看起来不同,但仍不如预期。提示后打印第二行。

user@server$ ./main.out
This line is from Parent pid 31599
user@server$ This line is from Child pid 31600

1 个答案:

答案 0 :(得分:1)

你的两个进程不同步,这意味着父子同时运行。在这种情况下,输出是不可预测的。例如,您可以使用wait()函数让父亲等待儿子的结束。

void parentProcess(void)
{
    wait(NULL);  // father is sleeping until his son dies
    char buffer[BUFFER_SIZE];
    int pid = (int) getpid();
    sprintf(buffer, "This line is from Parent pid %d\n", pid);
    write(1, buffer, strlen(buffer));
}