中断运行进程时被阻塞的线程的最简单方法

时间:2010-10-26 15:09:12

标签: c++ multithreading

我需要从守护进程通过“/ bin / sh”执行一些命令。有时这些命令执行时间太长,我需要以某种方式中断它们。守护进程是用C ++编写的,命令是用std :: system()执行的。我需要清理堆栈,以便在线程死亡时调用析构函数。 (在C ++异常处理程序中捕获事件将是完美的)。

使用boost:thread创建线程。不幸的是,在这种情况下,boost :: thread :: interrupt()或pthread_cancel()都不是很有用。

我可以想象几种方法,从编写我自己的system()版本到找到孩子的process-id和signal()。但必须有一个更简单的方法吗?

3 个答案:

答案 0 :(得分:2)

使用system命令执行的任何命令都在新进程中执行。不幸的是,系统会暂停当前进程的执行,直到新进程完成。如果子进程挂起,新进程也会挂起。

解决这个问题的方法是使用fork创建一个新进程并调用其中一个exec调用来执行所需的命令。然后,您的主进程可以wait查看子进程的进程标识(pid)。在SIGALRM来电之前使用alarm来电生成wait可以实现超时。

如果子进程超时,您可以使用kill命令将其终止。首先使用SIGTERM,如果失败,您可以再次尝试SIGKIL L,这肯定会杀死子进程。

可以找到有关fork和exec的更多信息here

答案 1 :(得分:2)

我没有尝试使用boost :: process,因为它不是boost的一部分。然而,我尝试了ACE_Process,它显示了一些奇怪的行为(超时有时有效,有时不起作用)。所以我编写了一个简单的std :: system替换,它可以轮询正在运行的进程的状态(有效地消除了多线程进程中进程范围信号和警报的问题)。我也使用boost :: this_thread :: sleep(),这样boost :: thread :: interrupt()应该作为替代或超时的补充。

Stackoverflow.com在我的Debian Debian下运行得不好(事实上,我根本无法回复,我不得不在VM中启动Windows)或Opera(在我的VM中),所以我无法以可读的方式发布代码。我的原型(在我将其移至实际应用程序之前)可在此处获取:http://www.jgaa.com/files/ExternProcess.cpp

答案 2 :(得分:0)

您可以尝试查看Boost.Process: Where is Boost.Process? 我已经等了很长时间才能上课。

如果您愿意使用Qt,一个不错的便携式解决方案是QProcess: http://doc.trolltech.com/4.1/qprocess.html

当然,您也可以制作自己的系统特定解决方案,如Let_Me_Be建议。

无论如何,你可能不得不摆脱system()函数调用,并用更强大的替代方法替换它。