3

嗨,我正在使用 iperf 测试网络吞吐量,因为我正在使用 NDK 创建 iperf c 代码的可执行文件,并且我能够成功启动该过程,如下所示:

 Process process ;
 process = new ProcessBuilder().command(commandList).redirectErrorStream(true).start();

但我担心的是,如果我的应用程序在某个时候崩溃(因此没有崩溃,但万一它崩溃了),那么外部进程会继续运行,所以我需要一种方法来随时从任何活动或服务。因此,如果有人有任何想法,请提供帮助。

4

1 回答 1

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 桥,而不是启动外部进程。

于 2013-04-26T14:23:18.260 回答