尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C语言多进程创建和回收

C语言多进程创建和回收
📅 发布时间:2026/6/20 1:43:38

一、多进程创建和回收

  • 孤儿进程:父进程先退出了,子进程没有退出,成为孤儿进程,父进程变成1号进程。
  • 僵尸进程:父进程没有退出,子进程退出了,但是父进程没有回收子进程资源,导致子进程变成僵尸进程。

1. fork()

创建子进程函数,一个进程可以创建多个子进程。

pid_t fork(void)
返回值小于0 创建失败等于0 是子进程大于0 是父进程
 
 

示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>int main()
{pid_t ret = fork();if (ret < 0){perror("fork error");return -1;}else if (ret > 0){printf("here is father,pid is [%d], child pid is [%d]\n", getpid(), ret);sleep(1);}else if (ret == 0){printf("here is child pid is [%d],father is [%d]\n", getpid(), getppid());}return 0;
}
 
 

2. wait()

父进程回收子进程,其中分为wait()和waitpid()函数

pid_t wait(int *status);
返回值大于0 返回值为回收的进程id返回-1 回收失败参数 status 进程回收状态可以使用下面的宏来说明当前的回收状态WIFEXITED(wstatus) 如果正常返回,返回trueWEXITSTATUS(wstatus) 用于输出正常返回的状态 用 %d 格式化输出WIFSIGNALED(wstatus) 如果被信号杀死,返回trueWTERMSIG(wstatus) 用于输出被哪个信号杀死 用 %d 格式化输出WIFSTOPPED(wstatus) 如果子进程停止了,返回trueWSTOPSIG(wstatus) 用于输出进程停止是由于哪个信号WIFCONTINUED(wstatus) 如果进程被信号SIGCONT重启,返回trueWCOREDUMP(wstatus) 如果子进程发生核心转储,返回true
 
 

示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>// pid_t wait(int *status);int main()
{pid_t ret = fork();if (ret < 0){perror("fork error");return -1;}else if (ret > 0){int waitstatus;printf("here is father,pid is [%d], child pid is [%d]\n", getpid(), ret);pid_t waitid = wait(&waitstatus);if (waitid == -1){perror("wait error");return -1;}else if (waitid > 0){printf("child pid [%d] is over\n", waitid);}if (WIFEXITED(waitstatus)){printf("exited, status=%d\n", WEXITSTATUS(waitstatus));}else if (WIFSIGNALED(waitstatus)){printf("killed by signal %d\n", WTERMSIG(waitstatus));}else if (WIFSTOPPED(waitstatus)){printf("stopped by signal %d\n", WSTOPSIG(waitstatus));}else if (WIFCONTINUED(waitstatus)){printf("continued\n");}}else if (ret == 0){printf("here is child pid is [%d],father is [%d]\n", getpid(), getppid());}return 0;
}//输出
here is father,pid is [24290], child pid is [24291]
here is child pid is [24291],father is [24290]
child pid [24291] is over
exited, status=0
 
 

3. waitpid()

waitpid中的第三个参数可以让回收进程变成非阻塞的。

pid_t waitpid(pid_t pid, int *status, int options);
返回值大于0 成功,返回的是回收的进程id等于0 返回0是因为第三个参数设置为了 WNOHANG ,等待是非阻塞的,并且这个时候没有子进程需要被回收小于0 回收失败参数 pid 进程id小于-1 :等待该数字绝对值的所在组所有子进程,例如-21328,则等待21328组内所有子进程-1 :等待所有子进程0 :等待组ID等于调用进程的组ID的子进程大于0 :等待某个子进程
参数 status 进程回收状态同wait函数的
参数 options 回收选项0 :不添加选项WNOHANG :如果没有子进程需要被回收,就立即返回WUNTRACED :如果一个子进程被停止了,就返回WCONTINUED :如果一个子进程被SIGCONT从停止转变为运行,就返回
 
 

示例:

创建多个子进程并回收它们

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>// pid_t waitpid(pid_t pid, int *status, int options);int main()
{int i = 0;for (i = 0; i < 3; i++){pid_t ret = fork();if (ret < 0){perror("fork error");return -1;}else if (ret > 0){printf("here is father,pid is [%d], child pid is [%d]\n", getpid(), ret);// pid_t waitid = wait(&waitstatus);}else if (ret == 0){sleep(3);printf("here is child [%d] pid is [%d],father is [%d]\n", i, getpid(), getppid());break;}}if (i == 3){int waitstatus;int num = 0;do{pid_t waitid = waitpid(-1, &waitstatus, WNOHANG);if (waitid == -1){perror("wait error");return -1;}else if (waitid > 0){printf("child pid [%d] is over\n", waitid);num++;}else if (waitid == 0){// 没有进程被回收,可以做其他事情sleep(1);continue;}if (WIFEXITED(waitstatus)){printf("[%d] exited, status=%d\n", waitid, WEXITSTATUS(waitstatus));}else if (WIFSIGNALED(waitstatus)){printf("[%d] killed by signal %d\n", waitid, WTERMSIG(waitstatus));}else if (WIFSTOPPED(waitstatus)){printf("[%d] stopped by signal %d\n", waitid, WSTOPSIG(waitstatus));}else if (WIFCONTINUED(waitstatus)){printf("[%d] continued\n", waitid);}if (num == i){break;}} while (1);}return 0;
}
//输出
here is father,pid is [24553], child pid is [24554]
here is father,pid is [24553], child pid is [24555]
here is father,pid is [24553], child pid is [24556]
here is child [0] pid is [24554],father is [24553]
here is child [2] pid is [24556],father is [24553]
here is child [1] pid is [24555],father is [24553]
child pid [24554] is over
[24554] exited, status=0
child pid [24555] is over
[24555] exited, status=0
child pid [24556] is over
[24556] exited, status=0

相关新闻

  • 【GIS】常见网格集
  • 2025年质量好的大型工业压榨机最新TOP品牌厂家排行
  • 局域网内连接mysql

最新新闻

  • Clawdbot本地AI网关:绿联NAS上的数字员工部署指南
  • SPI通信协议深度解析:时序、错误处理与实战配置
  • TradingAgents-CN:可审计的金融AI Agent工程化部署指南
  • 终极指南:如何用免费开源工具轻松抢到B站会员购热门门票
  • 无锡家电维修平台推荐:本地用户反馈较好的几家服务商深度实测对比——2026年6月最新发布 - 一步到家
  • Web自动化测试工具全解析:从Selenium到Playwright的实战选型指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号