2010-02-11 40 views
4

我使用JNI通过调用mkfifo()命令来创建命名管道。我正在使用mode = 0666.无法从Java中的命名管道读取

然后我尝试使用Java写入管道,但在写入管道时卡住了。我被困在下面一行,无法越过它。我也没有得到任何错误。

PrintWriter out = new PrintWriter((new BufferedWriter(new FileWriter(pipePath)))); 

请帮忙。

问候,

-H

PipePeer.java

import java.io.*;* 

public class PipePeer { 

    private native int createPipe(String pipeName, int mode);* // --------> native method to call mkfifo(pipeName, mode); 
    static { 
     System.load("/home/user/workspace/Pipes/libpipe.so"); 
    } 

    public static void main(String[] args) { 

     PipePeer p = new PipePeer(); 
     PipeImplement pi = new PipeImplement(); 
     String pipePath = "/home/user/workspace/Pipes/pipeFolderpipe1"; 
     int mode = 0777; 
     int createResult = p.createPipe(pipePath, mode); 
     if (createResult == 0) 
      System.out.println("Named pipe created successfully"); 
     else 
      System.out.println("Error: couldnot create Named pipe"); 


     String pipeLocation = "/home/user/workspace/Pipes/pipeFolder/pipe1"; 
     pi.writePipe("From Java", pipeLocation); 
     System.out.println(pi.readPipe(pipeLocation)); 
    } 
} 

PipeImplement.java

import java.io.*; 

public class PipeImplement { 

    public BufferedReader in; 
    public void writePipe(String strWrite, String pipePath){ 
     PrintWriter out = null; 
     try { 
     //-------------> cannot go past this line <-------------------- 
      out = new PrintWriter((new BufferedWriter(new FileWriter(pipePath)))); 
     } catch(IOException e) { 
      System.out.println("error while writing"); 
      e.printStackTrace(); 
     } 
     out.println(strWrite); 
     System.out.println("writen"); 
     out.close(); 
     System.out.println("close"); 
    } 

    public String readPipe(String pipePath) { 
     try { 
      in = new BufferedReader(new FileReader(pipePath)); 
     }catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     String lineRead = ""; 
     try { 
      lineRead = in.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return lineRead; 
    } 
} 

回答

8

那怎么在* nix工作命名管道。你打开管道时卡住了。 打开fifo进行写作将会阻止,直到有人打开阅读。

如果您尝试从同一个线程同步读取/写入管道,则必须进行死锁,您必须切换到NIO,或者创建一个从fifo读取的线程和一个写入该线程的线程。