我制作了两个程序,其中一个名为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行你 想要打印的东西"你输入的东西"每一秒.
你能解释一下为什么会这样,甚至更好地告诉我如何实现预期的行为?
printf 的输出正在缓冲,并且仅在缓冲区已满时才输出。您可以在消费者中调用 setbuf() (在开始时一次),并将 NULL 作为第二个参数,将 stdout 上的缓冲区大小设置为 NULL。
#include <stdio.h>
setbuf( stdout, NULL );
Run Code Online (Sandbox Code Playgroud)
这将导致写入标准输出(即您的 printf)的输出立即出现。或者,您可以写入 stderr,默认情况下它的缓冲区大小为 NULL。(或者,作为另一种选择,您可以在每次想要将缓冲区内容刷新到终端时在 stdout 上调用 fflush)。
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |