我需要从守护进程通过“/ bin / sh”执行一些命令。有时这些命令执行时间太长,我需要以某种方式中断它们。守护进程是用C ++编写的,命令是用std :: system()执行的。我需要清理堆栈,以便在线程死亡时调用析构函数。 (在C ++异常处理程序中捕获事件将是完美的)。
使用boost:thread创建线程。不幸的是,在这种情况下,boost :: thread :: interrupt()或pthread_cancel()都不是很有用。
我可以想象几种方法,从编写我自己的system()版本到找到孩子的process-id和signal()。但必须有一个更简单的方法吗?
答案 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()函数调用,并用更强大的替代方法替换它。