2017-05-29 8 views
1

私はUbuntu 16.04を使用しています。 JVMとプロセスが、私は彼らが実際にどのように通信するかを理解する必要があります別のものですので、私はJavaでのプロセスの理解[Linux]

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

としてJavaでプロセスを開始する必要があります。しかし、いくつかのロジックを実行するために

。そして何(チャネル、ソケット/ tcp/udp、パイプなど)を通して。

実際にデータをどのように転送しますか?

+2

「_since JVMとプロセスは、私が実際にどのように通信するかを理解するために必要なものとは異なる_」これは広すぎます。あなたは何を期待していますか?あなたはOSに基づいてどのような違いがあると思いますか? – AxelH

+1

@AxelH何が広すぎるのですか?あるプロセスが別のプロセスからのデータを要求する場合、プロセス間通信が必要です。それでどちら?ソケット?もしそうなら、どのソケット(TCP/UDP)? –

+1

これは本当に素晴らしい質問です。私は多くの人々がまだその質問の意味を理解しているとは思わない...私は本当にそれを理解する時間を取った。しかし一方で、あなたは 'ProcessBuilder'の' .inheritIO() 'メソッドを見たことがありますか? – fge

答えて

2

javadocから判断すると、デフォルトでパイプが使用されているようです。

1

OK、私は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交換が匿名パイプを使って行われると言います。