C中的子进程定期向管道写入数据

C中的子进程定期向管道写入数据,c,pipe,fork,sleep,C,Pipe,Fork,Sleep,我已经写了下面的代码。父进程writes一次一个字符,然后是sleep调用。子进程每次读取一个字节,读取后立即打印 然而,当我运行这个程序时,我在等待几秒钟后立即获得所有输出。我希望每秒有一个字符。为什么会这样 (我知道我可以一次写出所有字符串,但这是一个未来的实验。) 您正在使用printf打印接收字符printf将数据写入表示缓冲文件的文件对象。由于性能原因,它避免在满足某些条件(或收集了足够的数据)之前将数据写入实际文件。此处描述了何时可以刷新数据: 程序的输出很可能是“行缓冲的”,所以数

我已经写了下面的代码。父进程
write
s一次一个字符,然后是
sleep
调用。子进程每次读取一个字节,读取后立即打印

然而,当我运行这个程序时,我在等待几秒钟后立即获得所有输出。我希望每秒有一个字符。为什么会这样

(我知道我可以一次写出所有字符串,但这是一个未来的实验。)


您正在使用
printf
打印接收字符
printf
将数据写入表示缓冲文件的
文件
对象。由于性能原因,它避免在满足某些条件(或收集了足够的数据)之前将数据写入实际文件。此处描述了何时可以刷新数据:

程序的输出很可能是“行缓冲的”,所以数据实际上是在每一个新行字符上写入终端的

为了避免这种情况,您需要使用
fflush
在每个接收到的字符之后手动刷新数据。另一种方法是使用
setvbuf
更改缓冲策略

你想要这样的东西:

char c;
while (read(fd[READ_END], &c, 1) > 0) {
    printf("%c", c);
    fflush(stdout);
}

请注意,您还应该将数据读入
char
对象。

printf
默认情况下使用缓冲文件,它会在'\n'上自动刷新,或者如果您调用
fflush(stdout)


因此,只要在循环中读取后刷新即可。

您正在调用
read
,传递指针
read\u msg
。但是
read\u msg
指向何处?将
read
printf
混合在一起似乎很奇怪,缓冲打印是您困惑的根源。不要在子文件中使用
printf
,而是使用
write
。@williampersell因为
read
printf
用于不同的文件,所以可以混合它们。@Ivan从某种意义上说,混合它们是“可以”的,但仍然很奇怪。除非对它们的用途有充分的了解,否则它们当然不应该混合使用。啊,这是有道理的,一些程序员伙计,有趣的是,它仍然可以工作,我想它可能会对其他东西产生冲击。有一个关于行缓冲的问题,有一个很好的答案:
char c;
while (read(fd[READ_END], &c, 1) > 0) {
    printf("%c", c);
    fflush(stdout);
}