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

标签 java android multithreading process ping

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

为此,我在/system/bin/ping 中使用 ping 命令。显然这给了我一个 IOException“打开的文件太多”。我认为这是因为我没有正确关闭某些东西并且占用了资源。我尝试关闭输入流,但这没有帮助。

当我开始多次连续使用 pingHost() 时,就会发生这种情况...我有一个按钮,您可以按下该按钮来启动和取消网络扫描。每个 ping 都在单独的线程上运行,并且当按下按钮以阻止它们将 boolean “可运行”变量设置为 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$2.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)

最佳答案

似乎在您的情况下进程没有被销毁,您可以尝试在 process.waitFor() 之后使用 process.destroy()

关于启动进程时 Java Android ping IOException "Too many files open",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34551801/

相关文章:

java - 在 Java 中销毁对象

java - 非常大的 JTable、RowFilter 和额外的负载

android - 如何在 Android Studio 中生成具有自定义名称的输出 APK 文件?

android - 我如何获得一个矩阵,我在其中平移然后旋转然后平移然后再次旋转?

java - 不同线程同时调用方法

Java - 维护对象集合的顺序

Java:如果将类文字应用于原始类型,将生成什么类型​​的对象?

c# - 关闭\销毁异步方法中的 Activity

c++ - 为什么并行执行 Tcl_ExprDouble 的独立 Tcl 解释器需要互斥体?

c# - 使用 Sleep 模拟 Thread Yield 方法