【问题标题】:Simplest way to interrupt a thread that is blocked on running a process中断在运行进程时被阻塞的线程的最简单方法
【发布时间】:2010-10-26 15:09:11
【问题描述】:

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

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

我可以想出几种方法来做到这一点,从编写我自己的 system() 版本,到找到孩子的 process-id 和 signal() 它。但是一定有更简单的方法吗?

【问题讨论】:

  • 在提出新问题之前,您可能需要接受对以前的问题的一些答案。

标签: c++ multithreading


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以试试看Boost.Process: Where is Boost.Process? 这样的课我等了很久了。

      如果你愿意使用 Qt,一个不错的可移植解决方案是 QProcess: http://doc.trolltech.com/4.1/qprocess.html

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        相关资源
        最近更新 更多