Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java[linux]中的进程_Java_Process - Fatal编程技术网

理解Java[linux]中的进程

理解Java[linux]中的进程,java,process,Java,Process,我正在使用ubuntu16.04 为了执行一些逻辑,我需要在Java中启动一个进程,如下所示 String[] commandLine; String[] environment; //... Process p = Runtime.getRuntime().exec(commandLine, environment); InputStream processInputStream = p.getInputStream(); //<---- ? String[]命令行; 字符串[]环境;

我正在使用
ubuntu16.04

为了执行一些逻辑,我需要在Java中启动一个进程,如下所示

String[] commandLine;
String[] environment;
//...
Process p = Runtime.getRuntime().exec(commandLine, environment);
InputStream processInputStream = p.getInputStream(); //<---- ?
String[]命令行;
字符串[]环境;
//...
进程p=Runtime.getRuntime().exec(命令行,环境);

InputStream processInputStream=p.getInputStream()// 从javadoc来看,它似乎默认使用管道。

好的,这里有一个简短的测试,我也有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交换是使用匿名管道完成的。

“由于JVM和进程是不同的,我需要了解它们实际上是如何通信的。”这太宽泛了。你在期待什么?你认为基于操作系统会有什么不同?@AxelH你说的太宽是什么意思?如果一个进程从另一个进程请求一些数据,则需要进行一些进程间通信。那是哪一个呢?插座如果是,是哪个套接字(TCP/UDP)?这确实是一个很好的问题;我相信很多人还不明白这个问题的含义。。。我自己花了一些时间才真正理解它。但与此同时,您有没有看过ProcessBuilder的
.inheritario()
方法?我可以建议您编辑这个问题吗?我自己也有编辑权限,但我更喜欢OP。关于:“当您创建一个新进程时,std{in,out,err}是什么?”您具体询问的是
process.getInputStream()
?该方法通常对应于平台的C运行时作为子进程的
stdout
公开的操作系统构造。在Linux或任何兼容POSIX的系统上,它将是一个管道。