C语言中父进程如何在子进程终止时重启子进程
实现子进程自动重启的方案
完全可以通过父进程监控子进程运行状态,在子进程终止时自动重启,无需重启整机。
原代码问题
你当前的代码父进程仅执行无限打印逻辑,没有加入子进程状态监控的相关处理,因此子进程退出后父进程完全无法感知,自然不能触发重启逻辑。
核心实现逻辑
父进程通过wait()或waitpid()系统调用捕获子进程的终止事件,检测到子进程退出后,重新调用fork()生成新的子进程即可。
修改后的可运行示例代码
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <stdlib.h> int main() { pid_t pid; while(1) { pid = fork(); if (pid == 0) { // 子进程逻辑,替换为实际业务代码即可 while(1) { printf("Child process\n"); sleep(1); // 模拟特定事件触发子进程退出的场景,实际使用时替换为你的触发逻辑 // if (特定事件触发) { // exit(1); // } } } else if (pid > 0) { // 父进程阻塞等待子进程退出 wait(NULL); printf("子进程已终止,5秒后重启子进程...\n"); // 可选添加延迟,避免子进程持续崩溃时频繁fork耗尽系统资源 sleep(5); } else { // fork失败处理,嵌入式场景可输出错误日志后重试 perror("fork失败"); sleep(1); } } return 0; }
补充优化建议
- 如果父进程需要同时处理自身业务不能阻塞等待子进程,可以捕获
SIGCHLD信号,在信号处理函数中执行waitpid()回收子进程资源并标记重启位,父进程主循环检测到重启位后再执行fork操作,避免阻塞主业务逻辑。 - 可增加连续重启失败次数限制,避免子进程存在必现崩溃问题时,父进程无限fork耗尽系统资源。
- 路由器嵌入式场景下建议记录子进程退出的返回值和相关日志,方便排查子进程异常终止的根因。
内容的提问来源于stack exchange,提问作者Nayan
相关产品推荐
相关产品推荐

