我正在使用Ubuntu 16.04
。
要执行某些逻辑,我需要在Java中启动一个进程
String[] commandLine;
String[] environment;
//...
Process p = Runtime.getRuntime().exec(commandLine, environment);
InputStream processInputStream = p.getInputStream(); //<---- ?
但是由于JVM
和过程不同,我需要了解他们实际上是如何沟通的。通过什么(通道,套接字tcp / udp,管道或其他东西)。
他们如何实际传输数据?
答案 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交换是使用匿名管道完成的。