【问题标题】:Not able to read from named pipe in Java无法从 Java 中的命名管道读取
【发布时间】:2010-02-11 18:50:48
【问题描述】:

我正在通过调用 mkfifo() 命令使用 JNI 创建一个命名管道。我正在使用模式 = 0666。

然后我尝试使用 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;
    }
}

【问题讨论】:

    标签: java named-pipes


    【解决方案1】:

    这就是 *nix 上的命名管道的工作方式。你在打开管道时被卡住了。 打开 fifo 进行写入将阻塞,直到有人打开它进行读取。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多