理解Java中的进程[linux]

时间:2017-05-29 13:29:37

标签: java process

我正在使用Ubuntu 16.04

要执行某些逻辑,我需要在Java中启动一个进程

String[] commandLine;
String[] environment;
//...
Process p = Runtime.getRuntime().exec(commandLine, environment);
InputStream processInputStream = p.getInputStream(); //<---- ?

但是由于JVM和过程不同,我需要了解他们实际上是如何沟通的。通过什么(通道,套接字tcp / udp,管道或其他东西)。

他们如何实际传输数据?

2 个答案:

答案 0 :(得分:2)

从javadoc来看,它似乎默认使用管道。

答案 1 :(得分:1)

好的,这是一个简短的测试,我也有Ubuntu,虽然它是16.10,但我认为这些行为会相同。我写的程序:

public final class Test
{
    public static void main(final String... args)
        throws IOException
    {
        final ProcessBuilder pb = new ProcessBuilder("yes");
        final Process p = pb.start();

        try (
            final InputStream in = p.getInputStream();
        ) {
            while (true)
                in.read();
        }
    }
}

使用pstree -uplan,我发现yes进程的PID是某个数字n,当我这样做时:

ls -l /proc/n/fd

我得到了:

lr-x------ 1 fge fge 64 May 29 15:52 0 -> pipe:[1482898]
l-wx------ 1 fge fge 64 May 29 15:52 1 -> pipe:[1482899]
l-wx------ 1 fge fge 64 May 29 15:52 2 -> pipe:[1482900]

这让我说I / O交换是使用匿名管道完成的。