为什么从Process'InputStream块中读取altough数据是可用的

时间:2013-08-28 03:54:48

标签: java linux

爪哇:

Process p = Runtime.getRuntime().exec("myCommand");
final InputStream in = p.getInputStream();

new Thread()
{
    public void run()
    {
        int b;
        while ((b = in.read()) != -1) // Blocks here until process terminates, why?
            System.out.print((char) b);
    }
}.start();

CPP:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    printf("round 1\n");

    // At this point I'd expect the Java process be able
    // to read from the input stream.

    sleep(1);

    printf("round 2\n");

    sleep(1);

    printf("round 3\n");

    sleep(1);

    printf("finished!\n");

    return 0;

    // Only now InputStream.read() stops blocking and starts reading.
}

InputStream.read()的文档声明:

  

此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。

是的,我知道这个(因此与linux相关吗?):

  

java.lang.Process:由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子流程的输出流可能会导致要阻止的子进程,甚至是死锁。

我的问题是:

  1. 为什么InputStream.read()会阻塞,虽然我应该在进程启动后就已经有了数据?我错过了两边的东西吗?

  2. 如果它与linux相关,有没有办法从流程的输出流中读取而不会阻塞?

2 个答案:

答案 0 :(得分:7)

  

为什么从Process'InputStream块读取虽然数据可用

没有。这里的问题是,当您认为数据不是时,数据可用,并且这是由发件人缓冲引起的。

根据@ MarkkuK。的评论,或者告诉fflush()根本不要缓冲stdio,你可以用stdout克服这个问题。

答案 1 :(得分:0)

我发布了另一个解决方案here,其中包括在从InputStream#available()流中读取任何内容之前使用Process