2

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

4

2 回答 2

2

使用fork(2)execve(2)waitpid(2)而不是system(内部使用这些系统调用)。阅读高级 Linux 编程,它解释了棘手的细节。

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

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

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

于 2013-09-04T12:52:00.687 回答
1

如果你想使用exec你首先必须使用fork一个新的过程来执行实际的exec. 然后在超时之后你可以简单地创建kill子进程。(最后你可能想了解有关信号的内容。)

于 2013-09-04T12:53:03.347 回答