2011-09-15 38 views

回答

3

看起來這個例子沒有處理管道輸出側的沖洗。數據被緩衝在操作系統緩衝區中(等待幾千字節建立起來),而不是立即發送到另一個進程。請注意,此緩衝僅在輸出指向終端以外的其他位置時發生,因此在交互式測試時您不會看到它。 (其也如果正在被寫入大量數據,當具有緩衝的改進的效率是一個勝利者並不重要。)

在C側,在main函數的頂部添加此行:

setvbuf(stdout, NULL, _IONBF, 0); 

在TCL方面,添加此子程序的起動後:

fconfigure $mathModule -buffering none 

C面可以通過每printf後使用fflush也做。如果你被困在一個真正的C程序中,你無法獲得源代碼,你仍然可以通過用unbuffer程序包裝整個程序來取得進展(實際上是一個在Expect中使用魔術的Tcl腳本,子流程認爲它正在與終端通話)。 unbuffer的一個缺點是它使用了一個虛擬終端,它來自比普通的舊進程ID(更不用說管道/文件描述符)更爲有限的資源池。

0

我使用Expect成功地使用了示例C,它沒有掛起。另一件要學習的東西,但它完成了工作。另外,我正在學習flex/bison來替換示例中的C代碼。

+0

期望爲此工作。它的膽量有很大的詭異之處在於使其發生。 –