无法从 Java 中的命名管道读取

Posted

技术标签:

【中文标题】无法从 Java 中的命名管道读取【英文标题】:Not able to read from named pipe in 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;
    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于无法从 Java 中的命名管道读取的主要内容,如果未能解决你的问题,请参考以下文章

c++ 如何在构造函数中启动一个线程,从命名管道读取数据?

如何阻止在 Ruby 中读取命名管道?

Linux。 Python。从命名管道读取

键盘输入错误地重定向到命名管道读取

当作者来来去去时从命名管道重新读取

在java中创建命名管道