Linux
是否有一個在終止之前不發送 EOF 的程序以及如何創建它?
SIGINT
我懷疑一個程序在分別被和殺死時不發送 EOFSIGKILL
。是這樣嗎(或者所有程序是否總是發送 EOF 到stdout
並stderr
在以任何信號終止之後)?如果是,我該如何模仿這樣的過程,以便我可以在 Java 單元測試中使用它(它只需要在 Linux 上執行以供初學者使用)?英文維基百科 EOF 文章對此並不清楚,德國人說 EOF “可能”被發送。
我知道這可能是一個 XY 問題,並且在調試 Java 程式碼時尋求支持會更快地修復問題,但我也有興趣得到這個問題的答案。我還知道 Java 9 中的程序處理已經得到改進,但我還不能使用。
我正在使用帶有 Linux 4.10 的 Ubuntu 17.04。
An
EOF
並不是真正“發送”的。這是一個事件,您的程序呼叫read
系統呼叫並返回0
,對於管道,當管道的另一端已關閉時(如果文件描述符已複製,則由所有擁有它的程序)發生。核心將始終在終止程序時關閉*所有文件描述符。*沒有辦法解決它(即使是 SIGKILL 程序的文件描述符也會關閉)。如果這些文件描述符中的任何一個是對管道文件描述符寫入端的最後引用,
read
則相應讀取端的下一個將返回 0,這stdio
將解釋為EOF
.