c stdout到stdin实时

Dom*_*ýll 5 c linux io pipe

我制作了两个程序,其中一个名为generator,每秒打印一些文本

int main(int argc, char** argv) {

    for(int i = 0; i < 10 ; i++) {
         printf("something\n");
         sleep(1);
    }

  return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

然后有一个第二个程序现在称它为消费者,它应该从一个标准输入中读取一些其他文本并重新打印它.让它看起来像这样:

 int main(int argc, char** argv) {


   char line[BUFSIZ];

   while(scanf("%s",line) != -1){
       printf("you entered %s \n",line);
   }

    return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

当我编译它们并尝试只运行像./generator这样的生成器时,它按预期工作.每一秒都有东西打印到控制台.但是当我尝试像./generator一样运行它们时 ./consumer它没有像我预期的那样工作.我等了10秒,然后得到了10行 想要打印的东西"你输入的东西"每一秒.

你能解释一下为什么会这样,甚至更好地告诉我如何实现预期的行为?

Dan*_*arb 3

printf 的输出正在缓冲,并且仅在缓冲区已满时才输出。您可以在消费者中调用 setbuf() (在开始时一次),并将 NULL 作为第二个参数,将 stdout 上的缓冲区大小设置为 NULL。

#include <stdio.h>
setbuf( stdout, NULL );
Run Code Online (Sandbox Code Playgroud)

这将导致写入标准输出(即您的 printf)的输出立即出现。或者,您可以写入 stderr,默认情况下它的缓冲区大小为 NULL。(或者,作为另一种选择,您可以在每次想要将缓冲区内容刷新到终端时在 stdout 上调用 fflush)。