亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在將某些內容饋送到管道 STDIN 之前,無法跟蹤以管道 STDOUT 為食的運行進程

在將某些內容饋送到管道 STDIN 之前,無法跟蹤以管道 STDOUT 為食的運行進程

揚帆大魚 2023-04-26 16:07:02
我正在嘗試在正在運行的 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()fileexecve()program

如果file是命名管道/fifo,open()它將阻塞直到它的另一端也被打開。從那里你觀察到的行為,你的 java 程序直到你到達open()fifo 的另一端才開始。

您可以通過以讀/寫模式打開 fifo 輕松解決這個問題,這不會阻塞,但這意味著放棄檢測讀取器何時關閉其管道末端的能力——您的程序將永遠不會EOF打開它的標準輸入:

mkfifo testing
java Test 0<>testing


查看完整回答
反對 回復 2023-04-26
?
冉冉說

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


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號