我正在嘗試在正在運行的 Java 程序和控制臺之間實現基于命名 PIPE 的進程間通信。java程序(Test.java)的內容是:import java.io.*;public class Test { public static void main(String[] args) throws Exception { // starts pipe server InputStreamReader isReader = new InputStreamReader(System.in); BufferedReader bufReader = new BufferedReader(isReader); boolean shutdown = false; while(!shutdown) { String inputStr = bufReader.readLine(); if(inputStr != null) { System.out.println("PONG: "+inputStr); } Thread.sleep(1000); } }}程序編譯使用:javac Test.java創建了命名管道:mkfifo testing然后程序作為管道 STDOUT 的消費者運行:java Test < testing然后,使用控制臺,我向管道 STDIN 發送 ping:echo PING > testing由java程序捕獲,輸出:PONG: PING現在出現了一個奇怪的問題:無論何時運行 java 程序,直到將消息發送到 pipe ,使用ps eaux甚至在/proc/中都無法跟蹤其進程。這在 ubuntu(工作計算機)和 rhel(生產服務器)操作系統上重現。有誰知道為什么會這樣?
2 回答

胡說叔叔
TA貢獻1804條經驗 獲得超8個贊
這與您的 java 程序無關,但與您從中啟動它的 shell 以及命名管道的行為無關。
在諸如 之類的命令中program <file
,shell 首先會一個單獨的進程,然后通過ingfork()
執行重定向,最后是.open()
file
execve()
program
如果file
是命名管道/fifo,open()
它將阻塞直到它的另一端也被打開。從那里你觀察到的行為,你的 java 程序直到你到達open()
fifo 的另一端才開始。
您可以通過以讀/寫模式打開 fifo 輕松解決這個問題,這不會阻塞,但這意味著放棄檢測讀取器何時關閉其管道末端的能力——您的程序將永遠不會EOF
打開它的標準輸入:
mkfifo testing java Test 0<>testing

冉冉說
TA貢獻1877條經驗 獲得超1個贊
為了證明它與Java無關。
這里是在 Shell 中實現的相同代碼:
shutdown=1
while [ $shutdown -ne 0 ]; do
read -r inputStr
if [ -n "$inputStr" ]; then
echo "PONG: ${inputStr}"
fi
sleep 1.000s
done
sh Test.sh < testing
添加回答
舉報
0/150
提交
取消