【问题标题】:Android :Launching Iperf as separate processAndroid:将 Iperf 作为单独的进程启动
【发布时间】:2013-04-17 03:32:49
【问题描述】:
您好,我正在使用 iperf 来测试网络吞吐量,因为我正在使用 NDK 创建 iperf c 代码的可执行文件,并且我能够成功启动该过程,如下所示:
Process process ;
process = new ProcessBuilder().command(commandList).redirectErrorStream(true).start();
但我担心的是,如果我的应用程序在某个时候崩溃(因此没有崩溃,但万一它崩溃了),那么外部进程会继续运行,所以我需要一种方法来随时销毁这个进程任何活动或服务的时间。
所以如果有人有什么想法请帮忙。
【问题讨论】:
标签:
android
networking
process
【解决方案1】:
嗯,JVM 领域通常的解决方案是使用Runtime.addShutdownHook,但 Android 版本带有此警告:
请注意,在 Android 上,应用程序生命周期不包括 VM 终止,因此调用此方法并不能确保您的代码运行。相反,您应该使用最合适的生命周期通知(比如 Activity.onPause)。
由于您关心崩溃,您可以在任何可能崩溃的线程上设置未捕获的异常处理程序以终止子进程(查找Thread.setUncaughtExceptionHandler)。
除此之外,如果您知道 PID,您可以使用kill 发送信号(因为我们没有 pkill)。你可以试试Runtime.getRuntime().exec("kill -SIGINT <PID-goes-here>");
如果您没有 PID,Android 的标准映像带有 ps 版本,但遗憾的是不清楚它支持什么语法,所以我建议改为解析它的输出。 (此外,它在基础映像中的事实让我相信 OEM 构建也会拥有它)。
但是,是的,这是停止进程的一种不必要的困难方法。这只是你必须为使用 JVM-ish 付出的代价——你应该构建 JNI 桥,而不是启动外部进程。