我正在创建一个 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/