【C语言】多进程创建和回收

多进程创建和回收

  • 一、多进程创建和回收
    • 1. fork()
    • 2. wait()
    • 3. waitpid()
  • 最后

一、多进程创建和回收

  • 孤儿进程:父进程先退出了,子进程没有退出,成为孤儿进程,父进程变成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

最后

推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/28297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英伟达开源最强通用模型Nemotron-4 340B:开启AI合成数据新纪元

【震撼发布】 英伟达最新力作——Nemotron-4 340B,一个拥有3400亿参数的超级通用模型,震撼登场!这不仅是技术的一大飞跃,更是AI领域的一次革命性突破! 【性能卓越】 Nemotron-4 340B以其卓越的性能超越了Llama-3,专为合成数据而生。它将为医疗健康、金融、制造、零售等行…

Studio One 6.6.2 for Mac怎么激活,有Studio One 6激活码吗?

如果您是一名音乐制作人&#xff0c;您是否曾经为了寻找一个合适的音频工作站而苦恼过&#xff1f;Studio One 6 for Mac是一款非常适合您的MacBook的音频工作站。它可以帮助您轻松地录制、编辑、混音和发布您的音乐作品。 Studio One 6.6.2 for Mac具有直观的界面和强大的功能…

C++初学者指南第一步---1. C++开发环境设置

C初学者指南第一步—1. C开发环境设置 目录 C初学者指南第一步---1. C开发环境设置1.1 工具1.1.1 代码编辑器和IDE1.1.2 Windows1.1.3 命令行界面 1.2 编译器1.2.1 gcc/g (支持Linux/Windows/MacOSX)1.2.2 clang/clang (支持Linux/Windows/MacOS)1.2.3 Microsoft Visual Studio…

《面向对象程序设计》第3章 类与对象(判断、选择、填空)-练习

1-1 常量对象可以使用常量成员函数。 T F | 参考答案 答案 T 2分 1-2 在定义常量成员函数和声明常量成员函数时都应该使用const关键字。 T F | 参考答案 答案 T 2分 1-3 对象间赋值将调用拷贝构造函数。 T F | 参考答案 答案 F 2分 1-4 对象数组生命期…

奇思妙想-可以通过图片闻见味道的设计

奇思妙想-可以通过图片闻见味道的设计 偷闲半日享清闲&#xff0c;炭火烧烤乐无边。肉串飘香引客至&#xff0c;笑语欢声绕云间。人生难得几回醉&#xff0c;且把烦恼抛九天。今宵共饮开怀酒&#xff0c;改日再战新篇章。周四的傍晚&#xff0c;难得的闲暇时光让我与几位挚友相…

数据仓库和数据库的区别

数据仓库和数据库在许多方面存在显著的区别&#xff0c;主要体现在数据的用途、架构、设计原则和性能优化上。以下是两者之间的详细区别&#xff1a; 1. 目的和用途 数据库&#xff08;Database&#xff09;&#xff1a; 主要用途&#xff1a;用于日常业务操作和事务处理。数据…

PAT B1026. 程序运行时间

题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock(&#xff09;函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK——给出了机器时钟每秒所走的时钟打点数…

继电器的保护二极管如何选择

继电器在实际应用中&#xff0c;通常都会使用三极管或MOS管控制&#xff0c;其最基本的应用电路如图&#xff1a; 那为什么要在继电器线圈上并联一个二极管呢&#xff1f;我们可以看看没有并联二极管时电路会出现什么情况&#xff0c;我们使用下图所示的电路参数仿真一下&#…

食家巷助力“甘肃乡村振兴,百强主播·打call 甘味”活动

2024年&#xff0c;甘肃省“商务乡村振兴”促消费暨“百强主播打call 甘味”活动在天水市龙城广场盛大启动。 活动现场&#xff0c;来自甘肃省 14 个市州的农特产品展台琳琅满目&#xff0c;让人目不暇接。此次活动中&#xff0c;各企业带来了多款深受消费者喜爱的产品&a…

【AI实践】Dify调用本地和在线模型服务

背景 Ollama可以本地部署模型&#xff0c;如何集成私有数据、如何外部应用程序对接&#xff0c;因此需要有一个应用开发框架 Dify功能介绍 欢迎使用 Dify | 中文 | Dify 下文将把dify部署在PC上&#xff0c;windows环境&#xff1b; 安装部署 安装dify及docker jacobJacobs…

【图解IO与Netty系列】Netty源码解析——服务端启动

Netty源码解析——服务端启动 Netty案例复习Netty原理复习Netty服务端启动源码解析bind(int)initAndRegister()channelFactory.newChannel()init(channel)config().group().register(channel)startThread()run()register0(ChannelPromise promise)doBind0(...) 今天我们一起来学…

ssm162基于SSM的药房药品采购集中管理系统的设计与实现+vue

药房药品采购集中管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对药房药品采购信息管理混乱&…

购物车店铺列表查询流程

购物车店铺列表查询流程 购物车结算流程图

【Git】基础操作

初识Git 版本控制的方式&#xff1a; 集中式版本控制工具&#xff1a;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代码&#xff0c;是必须联网才能工作&#xff0c;局域网或者互联网。个人修改之后要提交到中央版本库 例如&#xff1a;SVM和…

IO与容器封装java

2.7 (Y. Daniel Liang英文版第11版P716&#xff1a;*17.8) (Update count) Suppose you wish to track how many times a program has been executed. You can store an int to count the file. Increase the count by 1 each time this program is executed. Let the pr…

如何选择合适的大模型框架:LangChain、LlamaIndex、Haystack 还是 Hugging Face

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

小北Chat GPT4o 文生图初体验~

前言 在人工智能领域中&#xff0c;生成图像和文本的技术一直在不断进步。OpenAI的Chat GPT-4结合DALL-E技术&#xff0c;为用户提供了一种全新的创作体验——通过文字生成图像。在这篇博客中&#xff0c;小北将分享几次与Chat GPT-4合作的创作过程&#xff0c;展示从文字描述到…

redis aof写入以及aof重写的源码分析

这里写目录标题 版本aof的面试问题aof正常写入流程aof重写流程 版本 redis&#xff1a;6.2.7 aof的面试问题 最近找工作&#xff0c;面试被问倒了&#xff0c;记录一下 比如redis的aof指令会不会丢失&#xff1f;比如在重写aof的什么新来的操作怎么办&#xff1f; 在重写的…

无限可能LangChain——概念指南之架构

本节包含对 LangChain 关键部分的介绍。 架构 LangChain 作为一个框架由多个包组成。 langchain-core 该包包含不同组件的基本抽象以及将它们组合在一起的方法。此处定义了LLM、向量存储、检索器等核心组件的接口。这里没有定义第三方集成。依赖项有目的地保持非常轻量级。…

LaTex入门教程

目录 1.说明 2.页面的分区 3.入门介绍 &#xff08;1&#xff09;命令 &#xff08;2&#xff09;环境 &#xff08;3&#xff09;声明 &#xff08;4&#xff09;注释 4.代码结构 &#xff08;1&#xff09;导言区 &#xff08;2&#xff09;支持中文 &#xff08;3…