好吧,所以我試圖從java代碼讀取c二進制文件的輸出,我無法確定通信通道是阻塞還是非阻塞。從java中執行C二進制文件和從進程的輸出流中讀取
的設置是這樣的:
一個Java類(
A.java
)運行A.java運行使用
Runtime.getRuntime().exec("B.o")
一個C二元(B.o
)。此時我有Process對象(通過的Runtime.exec返回)A.java使用一個BufferedReader
A.java輸出從輸入讀出的數據從所述處理對象的輸入流中讀取流式傳輸到一個文件(
output.txt
)
的柏二進制簡單的打印用printf函數調用隨機線。
現在,如果我運行上面的設置,我會收到由B.o
發送的所有數據完美無瑕。然後爲了測試(阻塞/非阻塞的事情),我在每次從B.o
的Process對象的輸入流讀取之後將A.java
更改爲睡眠5毫秒。事實證明,現在我沒有收到由B.o
發送的A.java
的完整數據。這表明正在使用的通信信道是非阻塞的(根據我的理解)。
然後,爲了確保,我開始查看java的源代碼,看看我是否正確。到目前爲止,我發現了以下內容:
對Runtime.getRuntime().exec(...)
的每個呼叫都以forkAndExec()
方法結束於ProcessImpl_md.c
。在ProcessImpl_md.c中,執行該命令,創建一個進程,併爲通信設置PIPES(使用c中的管道函數調用)。我找不到源代碼中的任何地方,其中PIPES被設置爲非阻塞模式(如我的代碼所示)。我假設PIPES默認爲阻塞狀態。
我知道這是一個非常糟糕的方法來檢查我想檢查。我認爲,我在這裏深深地陷入了困境,我只是無用而已。
任何人都可以點我在正確的方向,或者告訴我:
是PIPES通過Java運行時API創建進程的被阻塞或非阻塞?
當我從輸入流中讀取
A.java
後,爲什麼沒有收到所有數據? (假設是管道阻塞)任何非程序化的方法(即我沒有改變java和等!的源代碼),以找出是否PIPES的過程中被封鎖還是非阻塞?
謝謝。
編輯:(添加的代碼)
以下是不實際的(甚至編譯)代碼,但它顯示了什麼,我試圖做的。
「B.O」 來源:
#include <stdio.h>
void main(int argc, char*argv[]){
int a = 0;
for(; a<9000000; a++){
printf("%s", argv[1]);
}
}
「A.java」 來源:
<java imports>
public class A{
public static void main(String[] args) throws Exception{
Process p = Runtime.getRuntime().exec("./B.o");
BufferedReader br = new
BufferedReader(new InputStreamReader(p.getInputStream()));
int a = 0;
while(br.readLine() != null){
a++;
Thread.sleep(5);//data missed if this line not commented out
}
br.close();
System.out.println(a);
}
}
請檢查我的答案。無我問題。
我會避免使用可執行文件的擴展名*(* .o')。該擴展通常用於目標文件。 – 2015-02-10 17:33:33
睡眠不應該改變你從BufferedReader中包裝的InputStream獲得的輸入。 「非阻塞」讀取並不意味着您跳過輸入以獲取管道中最近的寫入。也就是說,目前尚不清楚爲什麼你要觀察跳過的數據。你能發佈相關的代碼嗎? – 2015-02-10 17:45:56
真的是「隨機」行嗎?你永遠不知道是否有人失蹤。 – laune 2015-02-10 17:49:50