gpt4 book ai didi

c - 失败/退出时监控和重启子进程

转载 作者:行者123 更新时间:2023-12-04 16:39:06 25 4
gpt4 key购买 nike

我创建了一个监视子进程并在它失败或退出时重新启动它的基本示例。这样做的首选/更可靠的方法是什么?不断轮询状态变化是一种好习惯吗?我的理解是我应该使用类似 SIGCHLD 的东西但一直无法找到任何好的例子。

我主要是一名嵌入式 C 编码员,这是我第一次尝试理解 fork() .此代码的目的最终将是使用exec() 监视对另一个程序的调用。并在失败或完成时重新启动该程序。

编辑:在@cnicutar 的评论之后,我以一种我认为更有意义的方式重写了下面的示例,希望它对以后的人有用。我希望 parent 在处理其他事情的同时监视子进程并重新调用 exec在一个新的fork当子进程失败/完成时。我想尝试使用 unix 信号来实现这一点

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[])
{
pid_t cpid;
int status;
cpid = fork();
for (;;)
{
switch (cpid)
{
case -1 : //Fork failure
exit(EXIT_FAILURE);
break;

case 0 : //Child Process
exec(some function);
return 0; //exit child process
break;

default : //Parent process
if (waitpid(-1, &status, WNOHANG) != 1) cpid = fork(); //restart
//Do parent stuff here...
break;
}
}
}

最佳答案

添加一个 SIGCHLD 处理程序不会给你带来太多好处,因为你已经一直在等待并且只这样做了 - 没有其他东西可以“中断”。

我建议的一件事是设置一个阈值,这样进程就不会太频繁地终止/启动。

My understanding is that I should utilize something like SIGCHLD but have been unable to find any good examples

您使用 SIGCHLD 来知道何时等待。典型的 SIGCHLD 处理程序只是在循环中执行 waitpid 直到没有 child 留下。在您的情况下,您不需要它,因为您的主要代码是在 waitpid 上停止的循环。


编辑

您可以找到大量有关 SIGCHLD 处理的示例。一个这样的例子是 How can I handle sigchld in C .在该代码中,在 while 之后,您可以fork:

while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;

pid = fork();
switch (pid)
...

重申一下,如果你这样做,每次 child 死亡时 SIGCHLD 都会被调用,在你适本地等待它之后你可以 fork 另一个。这只有在 parent 同时有更好的事情要做而不是仅仅阻塞 waitpid 时才有意义。


智者之言。某些函数不能从信号处理程序中调用,以免给程序添加棘手的错误。查找“异步信号安全”函数:这些并且只有这些可以从信号处理程序中调用。一些最常见的函数(如 printfmalloc)不能从信号处理程序中调用。

关于c - 失败/退出时监控和重启子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com