Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not able to read from named pipe in Java

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;
    }
}
like image 214
user271290 Avatar asked Jan 23 '23 14:01

user271290


1 Answers

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.

like image 133
leeeroy Avatar answered Jan 31 '23 06:01

leeeroy