Java Android 启动进程时 ping IOException "Too many files open"

Java Android ping IOException "Too many files open" when starting a process

我正在创建一个 Android 应用程序来 ping 网络上的许多主机...

为此,我在 /system/bin/ping 上使用了 ping 命令。显然这给了我一个 IOException "Too many files open"。我想这是因为我没有正确关闭某些东西并且用它阻塞了资源。我尝试关闭输入流但没有帮助。

当我经常多次开始使用 pingHost() 时会发生这种情况...我有一个按钮,您可以按下该按钮来启动和取消网络扫描。每个 ping 都是 运行 在一个单独的线程上,当按下按钮停止它们时将停止,将布尔 "runnable" 变量设置为 false。如果此按钮被按下和关闭几次,它会变慢。那可不酷。哈哈

我一直在玩这个程序,试图找出我忘记关闭的东西,但没有成功。

我试过 proc.destroy() 但它未能破坏进程。我假设这也会引发返回 proc 的 exitValue() 的问题。可能有一个我不理解的简单解决方案。我一直在玩这个,但没有运气。如果可能的话,我想要一些帮助! :)

public static int pingHost(String host) throws IOException, InterruptedException {
    String cmd = "/system/bin/ping -c 1 -W 1000 " + host;
    Process proc = Runtime.getRuntime().exec(cmd);
    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
    String line;
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }
    proc.waitFor();

    input.close();
    return proc.exitValue();
}

Blockquote at java.lang.ProcessManager.exec(ProcessManager.java:211) 12-31 16:24:07.306 13243-15816/sage.networktools W/System.err: at java.lang.Runtime.exec(Runtime.java:168) 12-31 16:24:07.306 13243-15816/sage.networktools W/System.err: at java.lang.Runtime.exec(Runtime.java:241) 12-31 16:24:07.306 13243-15816/sage.networktools W/System.err: at java.lang.Runtime.exec(Runtime.java:184) 12-31 16:24:07.306 13243-15816/sage.networktools W/System.err: at sage.networktools.MainActivity.pingHost(MainActivity.java:98) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at java.lang.Runtime.exec(Runtime.java:184) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at sage.networktools.MainActivity.pingHost(MainActivity.java:98) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at sage.networktools.MainActivity.run(MainActivity.java:189) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at java.lang.Thread.run(Thread.java:856) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: Caused by: java.io.IOException: Too many open files 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at java.lang.ProcessManager.exec(Native Method) 12-31 16:24:07.316 13243-15791/sage.networktools W/System.err: at java.lang.ProcessManager.exec(ProcessManager.java:209)

我想出了一个非常烦人的解决方法来解决我的问题。如果有更清洁的解决方案,请告诉我。

我将创建的每个线程添加到 ArrayList。单击停止按钮时,我会中断列表中的每个线程。

仍然不是我希望的那种解决方案...但至少它有效。

在你的情况下似乎进程没有被破坏,你可以尝试在 process.waitFor()

之后使用 process.destroy()