为什么在Bash中使用管道时printf不起作用?

时间:2011-04-18 14:02:40

标签: c bash printf

我有一个Bash脚本work.sh,可以从 STDIN 获取内容并将其回显到 STDOUT

我还有一个C程序return_input,它也可以从 STDIN 和printf到 STDOUT

但是当我用这种方式链接它们时:

./work.sh |./return_input
printf中的

return_input仅在退出时输出到屏幕。为什么呢?

简化为:

[root@ test]# cat work.sh
#!/bin/bash
for i in {1..5}
do
   echo test
   read
done

cat return_input.c

的输出
#include <stdio.h>

void return_input (void){
    char array[30];
    gets (array);
    printf("%s\n", array);
    printf("%#p\n", *(long *)(array+40));
}

main() {
    while(1 == 1)return_input();
    return 0;
}

2 个答案:

答案 0 :(得分:4)

所有I / O操作通常都是缓冲的。这就是为什么只有在程序完成后才能获得输出,如果在执行期间没有太多数据溢出缓冲区和输出。

如果要在“实时”中查看输出,可以使用强制完成I / O操作的fflush函数并清除缓冲区

答案 1 :(得分:1)

你应该发布一些代码。

尝试确保刷新输出(在写入后使用C中的fflush(stdout);),和/或文本包含换行符,因为通常会强制刷新输出。< / p>

否则输出可能会“卡在”缓冲区中,这是一种优化,而不是在进程之间的管道中发送单个字节。