Link to the example... on wiki.tcl.tk爲什麼不擴展TCL示例不工作?
這裏有一個例子,通過使用通過管道進行通信的可執行模塊來擴展tcl。 (位於標有可執行模塊(EM)的部分)
我已經使用Ubuntu和Windows XP編譯了該程序。當我嘗試運行測試模塊的腳本時 - 它們都掛起。
這個例子中缺少什麼?
Link to the example... on wiki.tcl.tk爲什麼不擴展TCL示例不工作?
這裏有一個例子,通過使用通過管道進行通信的可執行模塊來擴展tcl。 (位於標有可執行模塊(EM)的部分)
我已經使用Ubuntu和Windows XP編譯了該程序。當我嘗試運行測試模塊的腳本時 - 它們都掛起。
這個例子中缺少什麼?
看起來這個例子沒有處理管道輸出側的沖洗。數據被緩衝在操作系統緩衝區中(等待幾千字節建立起來),而不是立即發送到另一個進程。請注意,此緩衝僅在輸出指向終端以外的其他位置時發生,因此在交互式測試時您不會看到它。 (其也如果正在被寫入大量數據,當具有緩衝的改進的效率是一個勝利者並不重要。)
在C側,在main
函數的頂部添加此行:
setvbuf(stdout, NULL, _IONBF, 0);
在TCL方面,添加此子程序的起動後:
fconfigure $mathModule -buffering none
C面可以通過每printf
後使用fflush
也做。如果你被困在一個真正的C程序中,你無法獲得源代碼,你仍然可以通過用unbuffer
程序包裝整個程序來取得進展(實際上是一個在Expect中使用魔術的Tcl腳本,子流程認爲它正在與終端通話)。 unbuffer
的一個缺點是它使用了一個虛擬終端,它來自比普通的舊進程ID(更不用說管道/文件描述符)更爲有限的資源池。
我使用Expect成功地使用了示例C,它沒有掛起。另一件要學習的東西,但它完成了工作。另外,我正在學習flex/bison來替換示例中的C代碼。
期望爲此工作。它的膽量有很大的詭異之處在於使其發生。 –