我有一个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;
}
答案 0 :(得分:4)
所有I / O操作通常都是缓冲的。这就是为什么只有在程序完成后才能获得输出,如果在执行期间没有太多数据溢出缓冲区和输出。
如果要在“实时”中查看输出,可以使用强制完成I / O操作的fflush
函数并清除缓冲区
答案 1 :(得分:1)
你应该发布一些代码。
尝试确保刷新输出(在写入后使用C中的fflush(stdout);
),和/或文本包含换行符,因为通常会强制刷新输出。< / p>
否则输出可能会“卡在”缓冲区中,这是一种优化,而不是在进程之间的管道中发送单个字节。