在 Linux 中监视和终止其他程序停滞进程的更好方法?
Better way to monitor and kill other program's stalled process in linux?
我需要我的程序运行其他程序,但如果另一个程序在某个时间限制内没有返回,我需要杀死它。我想出了以下似乎有效的解决方案。
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 processn");
kill(proc1, SIGTERM);
break;
}
}
}
else if(proc1==0)
{
execlp("./someprogram", "./someprogram", "-a", "-b", NULL);
}
//else if fork failed etc.
return 0;
}
我需要我的程序尽可能健壮,但我是 linux 编程的新手,所以我可能不知道它可能出现的问题。我的问题是:1.这是解决此特定问题的正确方法还是有更好的方法?2.是否有人看到可能导致意外行为或系统资源泄漏的可能问题或错误?
如果程序被信号杀死(包括由于违反分段而导致的崩溃),(WIFEXITED(retval))
不会返回true。
可能最好只是检查是否从waitpid
成功返回。只有当程序终止(无论是否自愿)时,才会发生这种情况。
取决于确保该过程消失的重要性......
用SIGTERM
杀死这个过程后,你可以再睡一秒钟左右,如果它仍然没有消失,请使用SIGKILL
来确定。
相关文章:
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 运行代码时,c++ 会终止进程
- 可以读入进程内存的最大块大小是多少?
- 枚举进程模块在有效句柄上返回无效句柄
- 如何读取特定地址的进程内存?
- 在 Linux 中监视和终止其他程序停滞进程的更好方法?