從LISP調用的命令遇到緩衝IO流問題,如何關閉它?我發現只有沖洗功能,這在這種情況下是沒有用的。IO緩衝關閉
IO緩衝關閉
回答
你不能這樣做,
有打開緩衝和關閉沒有可移植的方法,以及一個很好的理由:緩衝I/O是快幾個數量級。
你不應該嘗試這樣做,
你也許能夠找出如何做到這一點在你使用的執行,但是這將是浪費時間 - 你很快就會意識到,這是一個錯誤。請你幫個忙,不要追溯我的腳步 - 我在20年前嘗試過。
有一個更好的辦法
當你寫完,只是flush the output。
你可以使用類或宏來封裝它,這樣就不需要額外的輸入。
這是有很多原因
請注意,我建議這種方法會讓你的代碼的可讀性更好 - 它會要求你明確指定消息邊界。請記住,您爲其他人(以及自己6個月以後)編寫代碼來讀取,修改和調試。
謝謝,但如何做到這一點,當funtion運行命令shell腳本重定向io從命令lisp IO流,我無法刷新它們,因爲我不知道什麼時候命令執行讀取/寫入 – Seraph
好吧,這個是一個非常特殊的情況:_usually_ shell命令(例如'ls')和lisp外殼管道是_line_緩衝的,這正是你想要的。如果不是這種情況,請通過一個可重複的例子問一個單獨的問題。 – sds
@Seraph你有「輸入緩衝」或「輸出緩衝」的問題嗎?也就是說,你是否陷入了困境,因爲你寫給命令的東西沒有發送給它('finish-output',朋友們應該在這裏幫忙),或者你讀的東西是生成的命令已經打印?如果是後者,它可能會被命令緩衝,而不是通過管道或lisp環境。 – Vatine
於是,我終於發現了問題(也許錯誤?)
形式如下(SBCL API)
(run-program "sudo" '("mv" "foo.txt" "/usr/bin")
:search t
:output t
:input t
:wait t)
這工作正是我想要的,問題是,而不是T的輸入和輸出參數,我指定*standard-input*
和*standard-output*
這導致不正確的命令工作(如果被調用的程序需要像sudo這樣的用戶的一些輸入)。
不知道爲什麼,但至少現在它可以工作。
- 1. 緩衝IO與非緩衝IO
- 2. C++緩衝流IO
- 3. Java IO緩衝區導航
- 4. perl中的無緩衝IO
- 5. Haskell默認io緩衝
- 6. Python文件io緩衝
- 7. 什麼是IO流緩衝?
- 8. fork()和緩衝IO流
- 9. Ruby中的緩衝IO
- 10. 文件IO和緩衝區
- 11. 關閉緩衝區後顯示Emacs緩衝區
- 12. 如何關閉IO?
- 13. HttpURLConnection關閉IO流
- 14. 自動關閉暫存緩衝區
- 15. Vim-airline關閉緩衝區/退出vim
- 16. 如何關閉grep行緩衝
- 17. emacs編譯緩衝區自動關閉?
- 18. 標誌爲gcc關閉stdout的緩衝?
- 19. 關閉/關閉對TCP接收緩衝區的影響
- 20. Vim關閉窗口而不關閉緩衝區
- 21. 內存緩衝區和IO操作
- 22. 改變bash的IO緩衝設置
- 23. Erlang io:格式緩衝和效率
- 24. 使用stdio.h異步緩衝io?
- 25. 什麼是文件IO流緩衝區?
- 26. 關閉Magpie緩存關閉
- 27. Java io流關閉錯誤
- 28. Java IO異常 - 流關閉
- 29. Vim - 每次關閉緩衝區時停止緩衝區編號自動遞增
- 30. 如何關閉輸入/輸出緩衝區中的輸入/輸出緩衝區
請問您可以添加更多的細節,請問哪些命令,如何調用,怎樣的麻煩? – cybevnm
*「...在這種情況下」*。哪種情況? – coredump
殼命令精確 – Seraph