欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

java mkfifo_在Java中创建命名管道

发布时间:2025/4/5 java 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java mkfifo_在Java中创建命名管道 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

我正在尝试使用Java创建命名管道.我正在使用Linux.但是,我遇到了写入管道的问题.

File fifo = fifoCreator.createFifoPipe("fifo");

String[] command = new String[] {"cat", fifo.getAbsolutePath()};

process = Runtime.getRuntime().exec(command);

FileWriter fw = new FileWriter(fifo.getAbsoluteFile());

BufferedWriter bw = new BufferedWriter(fw);

bw.write(boxString); //hangs here

bw.close();

process.waitFor();

fifoCreator.removeFifoPipe(fifo.toString());

fifoCreator:

@Override

public File createFifoPipe(String fifoName) throws IOException, InterruptedException {

Path fifoPath = propertiesManager.getTmpFilePath(fifoName);

Process process = null;

String[] command = new String[] {"mkfifo", fifoPath.toString()};

process = Runtime.getRuntime().exec(command);

process.waitFor();

return new File(fifoPath.toString());

}

@Override

public File getFifoPipe(String fifoName) {

Path fifoPath = propertiesManager.getTmpFilePath(fifoName);

return new File(fifoPath.toString());

}

@Override

public void removeFifoPipe(String fifoName) throws IOException {

Files.delete(propertiesManager.getTmpFilePath(fifoName));

}

我正在写一个由1000行组成的字符串.写100行有效但1000行没有.

但是,如果我在外部shell上运行“cat fifo”,则程序继续执行并将所有内容写入而不会挂起.奇怪的是这个程序启动的cat子进程是如何工作的.

编辑:我在子进程上做了一个ps,它的状态为“S”.

解决方法:

外部流程具有您需要处理的输入和输出.否则,它们可能会挂起,但它们挂起的确切位置会有所不同.

解决问题的最简单方法是更改​​每次出现的问题:

process = Runtime.getRuntime().exec(command);

对此:

process = new ProcessBuilder(command).inheritIO().start();

Runtime.exec已过时.请改用ProcessBuilder.

更新:

inheritIO() is shorthand用于将Process的所有输入和输出重定向到父Java进程的输入和输出.您可以改为仅重定向输入,并自己读取输出:

process = new ProcessBuilder(command).redirectInput(

ProcessBuilder.Redirect.INHERIT).start();

然后,您需要从process.getInputStream()中读取进程的输出.

标签:java,linux,named-pipes

来源: https://codeday.me/bug/20190727/1558183.html

总结

以上是生活随笔为你收集整理的java mkfifo_在Java中创建命名管道的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。