2010-02-11 6 views
4

mkfifo() 명령을 호출하여 JNI를 사용하여 명명 된 파이프를 만듭니다. 모드 = 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에서 읽는 스레드 하나와이 스레드에 쓰는 하나의 스레드를 만들어야합니다 .

관련 문제