gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:11:01 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于c++ - 中断在运行进程时被阻塞的线程的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4025051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com