2016-12-15 182 views
-2

從LISP調用的命令遇到緩衝IO流問題,如何關閉它?我發現只有沖洗功能,這在這種情況下是沒有用的。IO緩衝關閉

+0

請問您可以添加更多的細節,請問哪些命令,如何調用,怎樣的麻煩? – cybevnm

+0

*「...在這種情況下」*。哪種情況? – coredump

+0

殼命令精確 – Seraph

回答

5

你不能這樣做,

有打開緩衝和關閉沒有可移植的方法,以及一個很好的理由:緩衝I/O是快幾個數量級。

你不應該嘗試這樣做,

你也許能夠找出如何做到這一點在你使用的執行,但是這將是浪費時間 - 你很快就會意識到,這是一個錯誤。請你幫個忙,不要追溯我的腳步 - 我在20年前嘗試過。

有一個更好的辦法

當你寫完,只是flush the output

你可以使用類或宏來封裝它,這樣就不需要額外的輸入。

這是有很多原因

請注意,我建議這種方法會讓你的代碼的可讀性更好 - 它會要求你明確指定消息邊界。請記住,您爲其他人(以及自己6個月以後)編寫代碼來讀取,修改和調試。

+0

謝謝,但如何做到這一點,當funtion運行命令shell腳本重定向io從命令lisp IO流,我無法刷新它們,因爲我不知道什麼時候命令執行讀取/寫入 – Seraph

+1

好吧,這個是一個非常特殊的情況:_usually_ shell命令(例如'ls')和lisp外殼管道是_line_緩衝的,這正是你想要的。如果不是這種情況,請通過一個可重複的例子問一個單獨的問題。 – sds

+0

@Seraph你有「輸入緩衝」或「輸出緩衝」的問題嗎?也就是說,你是否陷入了困境,因爲你寫給命令的東西沒有發送給它('finish-output',朋友們應該在這裏幫忙),或者你讀的東西是生成的命令已經打印?如果是後者,它可能會被命令緩衝,而不是通過管道或lisp環境。 – Vatine

0

於是,我終於發現了問題(也許錯誤?)

形式如下(SBCL API)

(run-program "sudo" '("mv" "foo.txt" "/usr/bin") 
    :search t 
    :output t 
    :input t 
    :wait t) 

這工作正是我想要的,問題是,而不是T的輸入和輸出參數,我指定*standard-input**standard-output*這導致不正確的命令工作(如果被調用的程序需要像sudo這樣的用戶的一些輸入)。

不知道爲什麼,但至少現在它可以工作。