对于我正在处理的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()什么都不起作用,因为我"丢失"了main。我能做什么?我在Linux上。
使用fork(2)、execve(2)和waitpid(2),而不是system
(内部使用这些系统调用)。阅读高级Linux编程,其中解释了棘手的细节。
您可以在孩子中使用setrlimit(2)。或者在父进程中,在超时时杀死(2)子进程(首先使用SIGTERM
,然后使用SIGKILL
)。
您可能希望子进程使用setpgid(2)或setpgrp
创建自己的进程组,然后使用killpg(2)终止整个进程组。这将杀死子进程和它启动的任何命令(除非它们自己创建自己的进程组)。
您可以使用sigaction(2)处理SIGCHLD
信号(请参阅信号(7))。当子进程终止时,CCD_ 6将被显著地发送。
如果要使用exec
,首先必须使用fork
一个新进程来执行实际的exec
。然后在超时之后,您可以简单地kill
子进程。(最后你可能想了解一下信号。)