views:

67

answers:

1

Hello,

I am creating a named pipe using JNI by calling the mkfifo() command. I am using mode = 0666.

I am then trying to write into the pipe using Java, but I get stuck while writing into the pipe. I get stuck at the following line and not able to go past it. I am not getting any error either.

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

Please help.

Regards,

-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;
    }
}
+2  A: 

That's how named pipes on *nix work. You're getting stuck at opening the pipe. Opening a fifo for writing will block until someone opens it for reading.

You'll deadlock if you try to read/write to the pipe from the same thread synchronously, you'ld have to either switch to NIO, or create one thread that reads from the fifo and one thread that writes to it.

leeeroy