在我的过程中,我需要启动/重新启动另一个进程.
目前我使用一个小堆栈大小的线程和以下代码:
void startAndMonitorA()
{
while(true)
{
system("myProcess");
LOG("myProcess crashed");
usleep(1000 * 1000);
}
}
我觉得这不是最好的做法.我不知道std :: system()调用阻塞或浪费的资源.我在嵌入式Linux上 – 所以一般来说我都在关心资源.
解决方法:
所示的代码适用于大多数情况.如果您真的关心资源使用情况,您应该知道您正在为正在监视的每个进程启动(并保留)一个线程.如果你的程序有一个事件循环,那么可以通过一些额外的努力(以及复杂性的增加)来避免这种事情.
实现这一点需要以下内容:
>而不是调用system(),使用fork()和exec()来启动外部程序.将其PID存储在全局表中.
>设置一个SIGCHLD处理程序,通知子事件退出的事件循环,例如通过向事件循环监视的管道写入一个字节.
>当一个孩子退出时,在一个循环中运行带有WNOHANG标志的waitpid,该循环只要有孩子收获就会运行. waitpid()将返回退出的子节点的PID,以便您知道从表中删除其PID,并安排重新启动它的超时.
标签:c-2,linux,child-process
来源: https://codeday.me/bug/20190627/1308135.html