2011-04-18 83 views
0

我有一個Bash腳本work.shSTDIN得到的東西,並將其回顯到STDOUT爲什麼printf在Bash中管道不工作?

我也有一個C程序,return_input,這也從STDIN和printf拿東西STDOUT

但是,當我把它們連這樣:

./work.sh |./return_input 

return_inputprintf只輸出到屏幕退出時。爲什麼?

簡體:

[[email protected] 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; 
} 
+3

你需要刷新輸出? – James 2011-04-18 14:03:40

+0

@詹姆斯,什麼時候需要衝洗? – 2011-04-18 14:05:20

+0

它只是我,還是return_input只讀*一次*和work.sh寫東西,因爲它一直沿着?看起來像return_input應該在某種循環中讀取work.sh的輸出。 – 2011-04-18 14:27:06

回答

1

你應該張貼一些代碼。

嘗試確保輸出已刷新(在寫入C後使用fflush(stdout);),和/或文本中包含換行符,因爲通常會強制輸出被刷新。

否則,輸出可能會「卡住」在緩衝區中,這是一種優化,而不是通過進程之間的管道發送單個字節。

+0

「打開時,只有在可以確定不引用交互式設備時,流才被完全緩衝。」 (C90)。 STDOUT應該是一個交互式設備,至少在每個'\ n'處發生沖洗。 – AProgrammer 2011-04-18 14:16:14

+0

如何使用bash在'work.sh'中強制刷新?] – 2011-04-18 14:26:12

+0

我已經提供了上面的簡化示例:) – 2011-04-18 14:38:31

4

所有的I/O操作通常都是緩衝的。這就是爲什麼只有在程序結束後才能得到輸出,如果在執行期間沒有太多的數據溢出緩衝區和輸出。

可以使用fflush功能,它強制完成I/O操作和清晰的緩衝區,如果你想看到「實時」