我需要我的程序运行其他程序,但如果其他程序在一段时间内没有返回,我需要杀死它。我提出了以下似乎有效的解决方案。
int main()
{
int retval, timeout=10;
pid_t proc1=fork();
if(proc1>0)
{
while(timeout)
{
waitpid(proc1, &retval, WNOHANG);
if(WIFEXITED(retval)) break; //normal termination
sleep(1);
--timeout;
if(timeout==0)
{
printf("attempt to kill process\n");
kill(proc1, SIGTERM);
break;
}
}
}
else if(proc1==0)
{
execlp("./someprogram", "./someprogram", "-a", "-b", NULL);
}
//else if fork failed etc.
return 0;
}
我需要我的程序尽可能健壮,但我不熟悉linux下的编程,所以我可能不知道它可能存在的问题。我的问题是: 1.这是解决这一特定问题的正确方法还是有更好的方法? 2.有没有人看到可能导致意外行为或系统资源泄漏的问题或错误?
答案 0 :(得分:2)
(WIFEXITED(retval))
将无法返回true。
可能最好只检查waitpid
的成功返回。只有在程序终止时(无论是否自愿),才会发生这种情况。
取决于确保流程消失的重要性...
在使用SIGTERM
终止该过程后,您可以再睡一秒钟,如果它还没有消失,请使用SIGKILL
来确定。