C ++:外部应用程序调用的超时

时间:2013-09-04 12:48:00

标签: c++ timeout external boost-thread

对于我正在研究的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上。

2 个答案:

答案 0 :(得分:1)

使用fork(2)execve(2)waitpid(2)代替system(内部使用这些系统调用)。阅读Advanced Linux Programming,其中解释了棘手的详细信息。

您可能希望在孩子中使用setrlimit(2)。或者在父级kill(2)中,孩子(首先使用SIGTERM,然后使用SIGKILL)暂停。

您可能希望孩子使用setpgid(2)setpgrp创建自己的流程组,然后使用killpg(2)终止整个流程组。这会杀死子项及其启动的任何命令(除非这些命令本身创建了自己的进程组)。

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

答案 1 :(得分:1)

如果您想使用exec,首先必须fork使用实际的exec新进程。然后在超时后,您只需kill子进程。 (最后你可能想要阅读signals。)