2

私は、機能の 1 つがファイルから宛先に ping を実行する単純な GUI プログラムを持っています。通常のping xxxxを使用すると正常にpingが実行されますが、-tコマンドでこれを実行すると、コマンドウィンドウを閉じた後でもping.exeがプロセスリストに表示されていることに気付きました。ctrl+c を使用してプロセスを終了できることはわかっていますが、ユーザーが cmd ウィンドウを閉じたときにプロセスを終了させる別の方法はありますか?

私は現在このコードを使用しています:

try {
            ipPing = VNC.getIp().concat(ext);
            String command = "ping " + ipPing;
            Runtime rt = Runtime.getRuntime();
            rt.exec(command);
            rt.exec(new String[]{"cmd.exe", "/C", "\"start;" + command + "\""});

        } catch (IOException e) {
        }

アドバイスやヒントをいただければ幸いです

4

1 に答える 1

1

動作するかどうかはわかりませんが、Process.destroy()を試すことができます。このようなもの:

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "\"start;" + command + "\"");
Process p = pb.start();
//...
p.destroy();

また、空のキャッチブロックを書き込まないでください。

} catch (IOException e) {
}

例外がスローされた場合、気づきにくいからです。もちろん、例外を無視できることを知っている場合を除きます。

アップデート:

Linux OSの概念実証:

public static void main(String[] args) throws IOException {
    ProcessBuilder pb = new ProcessBuilder("ping","localhost");
    pb.redirectErrorStream(true);
    Process p = pb.start();
    InputStreamReader isr = new InputStreamReader(p.getInputStream());
    int ch,count = 0;
    StringBuffer sb = new StringBuffer();
    while((ch =isr.read()) > -1) {            
        sb.append((char)ch);                
       if ((char)ch == '\n') {
          System.out.println( sb.toString());
          sb = new StringBuffer();
       }
       if (count++ == 2) {
           System.out.println("destroying process");
           p.destroy();
       }
    }        
}    

出力:

destroying process
PING localhost (127.0.0.1) 56(84) bytes of data.

Exception in thread "main" java.io.IOException: Stream closed
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.031 ms

at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:107)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:93)
at java.io.InputStreamReader.read(InputStreamReader.java:151)
at com.infobip.rhino.Killer.main(Killer.java:24)
Java Result: 1

エラーストリームが出力ストリームにリダイレクトされるため、行が混乱します

于 2013-01-16T21:01:59.297 に答える