自学嵌入式day30,回收进程

父子进程关系与进程终止机制

父子进程内存管理 子进程通过fork()创建时,初始阶段完全共享父进程的内存空间(采用写时复制技术)。只有当父子进程尝试修改同一内存区域时,内核才会为子进程分配独立的内存副本。这种机制优化了资源使用效率。

进程终止的8种情况

  • 主函数main中执行return
  • 调用exit()函数(会清理I/O缓冲区和注册的退出函数)
  • 调用_exit()或_Exit()(直接终止,不清理缓冲区)
  • 主线程退出或调用pthread_exit()
  • 异常终止:abort()、收到kill信号、最后一个线程被pthread_cancel

进程终止后的状态管理

僵尸进程与孤儿进程

  • 僵尸进程:子进程终止但父进程未回收其PCB资源,导致内核残留进程信息。长期运行的父进程若频繁创建短期子进程,可能引发内核资源耗尽。
  • 孤儿进程 :父进程先终止,子进程由init进程接管并自动回收资源。

进程退出函数对比

  • exit(int status)
    行为:刷新缓冲区 → 调用atexit注册的函数 → 执行_exit
    状态码:EXIT_SUCCESS(0)或EXIT_FAILURE(1)
  • _exit(int status)
    行为:直接终止进程,不处理缓冲区或注册函数。

进程资源回收方法

wait函数

c 复制代码
pid_t wait(int *status);
  • 阻塞等待任意子进程退出,并回收其状态。
  • status参数:
    • 若为NULL,忽略退出状态。
    • 使用宏解析状态:
      • WIFEXITED(status):是否正常退出。
      • WEXITSTATUS(status):获取退出返回值。
      • WIFSIGNALED(status):是否因信号终止。
      • WTERMSIG(status):获取终止信号的编号。

waitpid函数

c 复制代码
pid_t waitpid(pid_t pid, int *status, int options);
  • pid参数:
    • -1:回收任意子进程(等价于wait)。
    • >0:回收指定PID的子进程。
    • 0:回收同进程组的子进程。
    • <-1:回收指定进程组内的子进程。
  • options参数:
    • 0:阻塞等待。
    • WNOHANG:非阻塞模式(立即返回,无子进程退出时返回0)。

示例:非阻塞回收

c 复制代码
int status;
pid_t pid = waitpid(-1, &status, WNOHANG);
if (pid > 0) {
    if (WIFEXITED(status)) {
        printf("Child %d exited with code %d\n", pid, WEXITSTATUS(status));
    }
}

关键注意事项

  • 资源泄漏风险 :长期运行的父进程必须通过wait/waitpid回收子进程,避免僵尸进程累积。
  • 信号处理 :若子进程因信号终止,父进程需通过WTERMSIG检查具体信号。
  • 非阻塞模式 :WNOHANG适用于父进程需同时处理其他任务的情况。
相关推荐
boy快快长大5 分钟前
EasyTier初次使用
服务器
MetaLite11 分钟前
Spring Boot 加了 @Valid,嵌套参数为什么还没校验?
java·spring boot·后端
zuiyuewentian12 分钟前
借助 AI 在 Win11 上搭建 Rocky Linux:用 Visual Studio 直接调试 Linux 服务
linux·运维·visual studio
半杯咖啡半行码12 分钟前
QML与 Qt Quick入门实战:从零基础到 C++ 双向通信详解
java·qt·交互
牢姐与蒯16 分钟前
WSL2 迁移教程:把Ubuntu+WSL2从C盘挪到别的盘
linux·运维·服务器·网络·ubuntu·1024程序员节
垆边人似月.18 分钟前
RDMA 文件传输踩坑(二):为什么 `sleep()` 不能保证接收端准备好了?
linux·服务器·网络·rdma
霸道流氓气质19 分钟前
Lingua 语言检测库:n-gram 统计模型、置信度阈值调优与 Spring Boot 分层检测管道的生产级实战
java·spring boot·后端
文丑颜不良啊29 分钟前
LeetCode1281~1300题目解析
java·leetcode
missile11132 分钟前
# HDR 算法 ISP 通路客制化方案(G100 / mt6789)
java·前端·javascript
DYWorker00142 分钟前
第 1-10 课: 横切设施:锁、RCU、安全与观测怎么选?
linux