You need to enable JavaScript to run this app. C语言中父进程如何在子进程终止时重启子进程
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:48:01