2011-05-31 59 views
0

我正在使用下面的java代碼寫入基本上從stdin讀取的C程序的stdin中,並將A_A_A添加到行尾並將其寫入返回到java程序從stdout中取出並輸出標準輸出Broken Pipe Java程序在外部C程序stdin中寫入和從stdout中讀取

BufferedWriter b_stdout = new BufferedWriter(new OutputStreamWriter(fuse.process.getOutputStream())); 
     String strLine; 
     BufferedReader br = new BufferedReader(new FileReader("/home/Desktop/data1024.dat")); 
       while ((strLine=br.readLine())!=null) 
        { 

         b_stdout.newLine();    
         b_stdout.write(strLine); 
         b_stdout.flush(); 
} 

data1024文件是大小爲1 MB的文本文件。以上是以下是這是繼

public void run(){ 
    try{ 
     String strLine; 
     int c; 
     BufferedReader bill_stdout = new BufferedReader(new InputStreamReader(fuse.process.getInputStream())); 
     BufferedWriter new_write = new BufferedWriter(new FileWriter("/homeDesktop/data89.dat")); 

    while ((strLine = bill_stdout.readLine()) != null) { 
     new_write.newLine(); 
     new_write.write(strLine); 

     System.out.println("output thread "+strLine); 
     new_write.flush(); 
       } 

現在,當C程序

main() { 
int rc; 
int df; 
int i; 
char buf[32768]; 
rc = fcntl(fileno(stdin), F_SETFL, O_NONBLOCK); 
FILE *fp; 
for (i=0;i<=10000000;i++) 
{ 
    int rc=-1; 
    memset(buf,'\0',32768); 
    //rc = fread(buf,5, 1, stdin); 
    rc = read(fileno(stdin),buf,32768); 
    if (rc > 0) 
    { 
     strcat(buf,"B_B_B_B_B_B_B_B_B"); 
     write(fileno(stdout),buf,strlen(buf)); 
     /*fp=fopen("wroteExeB","a"); 
     fprintf(fp,"%s",buf); 
     fclose(fp);*/ 
     //printf("%s",buf); 
    } 
} 

另一個Java線程從這個C程序的標準輸出讀入寫在C程序中的線程... 我運行程序

我constabtly面臨的破碎:管道錯誤

我能夠寫一些行到C程序,我可以發ee他們在輸入程序的標準輸出中。

有些線路是從輸出線,但是這是後幾行像17或18寫在C程序的輸入線,輸出部分提供了以下錯誤

java.io.IOException: Broken pipe 

可以在此有一個人幫助...我曾嘗試使用FileWriter一次寫入一個字符,而不是使用BufferedWriter在這種情況下,它的工作原理和不斷寫入字符。

我試圖減小輸入行的大小寫...我已經嘗試停止輸入線程,以便管道可能因爲已滿而數據尚未讀取而中斷。但沒有任何作品

請幫忙。 謝謝

回答

1

我沒有看詳細的代碼,但是C代碼設置stdin是非阻塞的?這不就是讓C程序馬上退出,當你試圖寫入C程序時會導致管道損壞嗎?

+0

我已經能夠通過將C程序中的buf大小增加到1 MB來解決Broken Pipe問題,但是在文件被寫入後,java輸出線程掛起了一段時間,直到它結束 – ssD 2011-06-01 17:38:52

0

「斷開的管道」表示您已寫入另一端已關閉的管道。換句話說,你違反了你和接收者之間的應用協議。這不僅僅是緩衝,阻塞/非阻塞模式等問題,它是一個設計錯誤。

+0

已經能夠通過將C程序中的buf大小增加到1 MB來解決Broken Pipe問題,但是在文件被寫入後,我不知道java輸出線程掛起了一段時間,直到它結束 – ssD 2011-06-01 17:39:03

+0

@ssD增加緩衝區大小隻是推遲這個問題,它並沒有解決它。你仍然在寫一些過程沒有閱讀的東西,因爲緩衝,你以後會這樣做。正確的解決方案是不寫。它當然不會被閱讀。 – EJP 2011-06-02 00:40:40