【问题标题】:C++: Timeout for an external application callC++:外部应用程序调用超时
【发布时间】:2013-09-07 23:39:09
【问题描述】:

对于我正在处理的 c++ 程序,我必须调用外部应用程序来执行一些操作。我无法修改应用程序。此操作可能需要太多时间,因此我必须添加超时。我尝试使用 system() 和 boost 线程

int main() 
{
  [...]

  boost::thread t(function1);
  t.timed_join(boost::posix_time::seconds(10));

  [...]

  return 0;
}

void function1()
{
  system("external application");
}

但是当我在 10 秒后返回主程序时,外部应用程序仍在后台运行。 使用 exec() 而不是 system() 没有任何效果,因为我“丢失”了主要内容。我能做些什么? 我在 Linux 上。

【问题讨论】:

  • 您希望发生什么?如果超时,终止进程?
  • 我想停止外部应用程序,因为它非常“昂贵”。

标签: c++ timeout external boost-thread


【解决方案1】:

使用fork(2)execve(2)waitpid(2) 而不是system(在内部使用这些系统调用)。阅读Advanced Linux Programming,其中解释了棘手的细节。

您可能想在孩子中使用setrlimit(2)。或者在父级kill(2) 中,子级(首先使用SIGTERM,然后使用SIGKILL)超时。

您可能希望子进程使用setpgid(2)setpgrp 创建自己的进程组,然后使用killpg(2) 终止整个进程组。这会杀死子进程和它启动的任何命令(除非它们自己创建自己的进程组)。

您可以使用sigaction(2) 处理SIGCHLD 信号(请参阅signal(7))。 SIGCHLD 会在子进程终止时发送。

【讨论】:

  • 这意味着没有办法杀死线程(在这种情况下是在 timed_join 之后),对吧?
  • 不行,因为你必须杀死子进程。
  • 我正在尝试使用 fork():还有另一个问题。我用 exec (minizinc) 调用的外部应用程序创建了另一个进程 (mzn2fzn)。当我的程序运行 kill(pid, SIGTERM) 或 kill(pid, SIGKILL) 我只杀死 minizinc:mzn2fzn 还活着。
  • 然后考虑使用流程组,正如我在答案中更新的那样(如果合适,您可以投票或接受)。
【解决方案2】:

如果您想使用exec,您首先必须使用fork 一个新进程来执行实际的exec。然后在超时之后你可以简单地kill子进程。 (最后你可能想了解signals。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2010-12-14
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多