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