2010-10-26 76 views
1

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

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

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

+0

在询问新问题之前,您可能想要接受一些**前面的问题**的答案。 – ereOn 2010-10-26 15:26:40

回答

2

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

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

0

你可以试试看看Boost.Process: Where is Boost.Process? 我一直在等这么长的时间。

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

当然,你也可以做出这样Let_Me_Be自己特定的系统解决方案建议。

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

2

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

解决这个问题的方法是使用fork创建一个新进程并调用其中一个exec调用来执行所需的命令。您的主进程可以在子进程的进程Id(pid)上输入wait。可以通过在调用wait之前使用alarm呼叫生成SIGALRM来实现超时。

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

叉子和exec一些详细信息,可以发现here