fork创建多个子进程

news2024/11/26 21:29:50

fork创建多个子进程

示例代码

fork1.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc,char **argv)
{
	int i, j;
	pid_t pid;
	

	for (i = 0; i < 3; i++)
	{
		pid = fork();
		if (pid < 0)
		{
			perror("fork()");
			exit(1);
		}
		if (pid == 0) //child
		{
			printf("Child is [%d]!\n",getpid());

		}
        
	}
    //为了方便分析添加sleep函数
	sleep(1000);
    
    exit(0);
}

运行结果

编译执行,如下图所示:

image-20230811085259904

计算创建进程的数量

不是创建3个子进程吗?上图中创建了(即2^3-1)7个子进程,加上父进程一共8个进程。这是因为在pid=6047即main进程,使用fork创建了3个子进程,这3个子进程没有直接退出,又分别调用fork创建子进程。

将上图整理分析如下图所示:

fork函数示意.drawio (1)

从上图我们可以看出来,原因是创建的子进程也调用了fork函数,要是想创建3个子进程,将创建的子进程调用exit(),就能避免子进程再次调用fork的问题。

进程的状态:

在子进程区域添加exit,我们看下进程的状态

fork1.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc,char **argv)
{
	int i, j;
	pid_t pid;
	

	for (i = 0; i < 3; i++)
	{
		pid = fork();
		if (pid < 0)
		{
			perror("fork()");
			exit(1);
		}
		if (pid == 0) //child
		{
			printf("Child is [%d]!\n",getpid());
			
            sleep(1000);
            //要让子进程退出
            exit(0);
		}
        
	}
	//将sleep放到这里
    //sleep(1000);
    
    exit(0);
}

在子进程退出前,调用sleep(1000),让父进程先结束,观察进程的状态,在终端输入如下命令

ps axf

如下图所示

image-20230811105520772

从上图可看出进程的状态是S+,即可中断的睡眠态。具体其他的状态可man ps看手册中解释如下:

image-20230811105019088

将上述代码中子进程中的sleep(1000)注释掉,sleep(1000)函数放到for循环外,编译执行代码,在终端输入如下命令,查看进程的状态

ps axf

如下图所示

image-20230811105701871

当前父进程的状态是S+,可中断的睡眠态,子进程状态是Z+,僵尸态。造成这种是因为子进程先死(退出)啦,但是现在父进程还在sleep()没来的及收尸,子进程现在就是僵尸态。

父进程回收子进程,主要是pid号有限的,要回收,子进程的僵尸态,其实占用不了多少资源,

孤儿进程:

当父进程先于子进程结束,活着的子进程就变为孤儿进程,孤儿进程会被init进程收养。

僵尸进程:

子进程结束,父进程还没有回收。

进程的状态变换

image-20230811072743606

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

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

相关文章

Zip压缩包有密码,如何删除?

Zip压缩包设置设置了密码&#xff0c;想要删除密码&#xff0c;除了将压缩包解压出来之后再将文件压缩为不带密码的压缩文件以外&#xff0c;还有一种删除密码的方法。设置方法如下&#xff1a; 右键点击zip文件&#xff0c;找到打开方式&#xff0c;以Windows资源管理器方式打…

sql server profiler使用

一、打开sql server profiler 二、配置 比如我们只过滤包含这个关键字的&#xff0c;输入&#xff1a;%Employees%

【C++11】lambda表达式 | 包装器

文章目录 一.lambda表达式1.lambda表达式概念2.lambda表达式语法3.lambda表达式交换两个数4.lambda表达式底层原理 二.包装器1.function包装器①function包装器介绍②function包装器统一类型③function包装器的意义 2.bind包装器①bind包装器介绍②bind包装器绑定固定参数③bin…

计算机基础之RAID技术

概述 RAID&#xff0c;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff0c;一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组&#xff08;逻辑硬盘&#xff09;&#xff0c;从而提供比单个硬盘更高的存储…

Springboot3整合使用aj-captcha行为验证码解决方案

截止到目前(2023-04-20)&#xff0c;Springboot最新稳定版本已经迭代到3.0.5&#xff0c;而我们项目中使用的行为验证码框架aj-captcha还没有适配Springboot3&#xff0c;码云上类似的请求也没有得到过回应&#xff0c;于是决定自己动手适配一下&#xff0c;研究下来发现适配3.…

oi知识表+NOIP提高组算法及算法思想总结

&#xfeff;算法及算法思想总结 │ By lib │ ├暴力 ├模拟 ├递归及递推:数位统计类 ├构造 ▼├排序算法 │ ├冒泡排序 │ ├选择排序 │ ├计数排序 │ ├基数排序 │ ├插入排序 │ ├归并排序 │ ├快速排序 │…

腾讯云轻量应用服务器地域怎么选?上海广州北京?

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置&#xff0c;如上海、广州和北京等地域&#xff0c;如何选择地域&#xff1f;地域的选择建议就近原则&#xff0c;用户距离轻量服务器地域越近&#xff0c;网络延迟越低&#xff0c;速度就越快&#xff0c;根据用…

day38 滑动窗口

1. 滑动窗口 应用场景&#xff1a; 满足xxx条件&#xff08;计算结果、出现次数、同时包含&#xff09; 关键词&#xff1a;最长最短子串无重复等等 1&#xff09;最长 左右指针在起始点&#xff0c;R 向右依次滑动循环&#xff1b; 如果&#xff1a; 窗内元素满足条件&#x…

聚观早报 | 三星和LG发展电车零件业务;宝马召回国产和进口电车

【聚观365】8月12日消息 三星和LG加速发展电车零件业务宝马召回部分国产和进口电动汽车华为有意推动车BU独立运营长城汽车CTO就“中国汽车在一起”发声比科奇芯片被Contela选为单元的核心组件 三星和LG加速发展电车零件业务 随着电动汽车需求的增加&#xff0c;对电池、芯片等…

Redis - 数据类型映射底层结构

简介 从数据类型上体现就是&#xff0c;同一个数据类型&#xff0c;在不同的情况下会使用不同的编码类型&#xff0c;底层所使用的的数据结构也不相同。 字符串对象 字符串对象的编码可以是 int、raw 和 embstr 三者之一。 embstr 编码是专门用于保存简短字符串的一种优化编…

.DS_Store是什么文件

dsstore是自定义属性的隐藏文件。dsstore全称“Desktop Services Store”&#xff0c;是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件&#xff0c;目的在于存贮目录的自定义属性&#xff0c;例如文件们的图标位置或者是背景色的选择。 dsstore是什么文件&#xff1f; ds…

高端百度地图开发2:自定义水滴头像(鼠标事件、API封装对接)

高端百度地图开发系列 高端百度地图开发1&#xff1a;自定义水滴头像&#xff08;自定义标注覆盖物、Overlay覆盖类&#xff09; 自定义水滴头像之鼠标事件、API封装对接 高端百度地图开发系列一、添加自定义覆盖物的方法二、对接API数据1.获取API数据(模拟)2.遍历数据3.添加自…

LeetCode--HOT100题(28)

目录 题目描述&#xff1a;2. 两数相加&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;2. 两数相加&#xff08;中等&#xff09; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且…

让我们玩个游戏:找出缅北诈骗网络中的“狼人杀”!

大数据产业创新服务媒体 ——聚焦数据 改变商业 近期&#xff0c;《孤注一掷》掀起了一阵观影热潮。这部电影展现了在高科技与诈骗手法交织下的惊心动魄的故事&#xff0c;不仅让观众们大呼过瘾&#xff0c;更让人们对现实生活中日益猖獗的缅北诈骗产生了深入的反思。 《孤注一…

【100天精通python】Day32:使用python操作数据库_MySQL下载、安装、配置、使用实战

专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 1 MySQL概述 MySQL是一款互联网上广泛使用的开源关系型数据库管理系统。它最初由瑞典的MySQL AB公司开发&#xff0c;并于1995年首次发布。如今&#xff0c;MySQL由Oracle公司维护…

Redis缓存设计

缓存能够有效地加速应用的读写速度&#xff0c;同时也可以降低后端负载&#xff0c;对日常应用的开发至关重要。但是将缓存加入应用架构后也会带来一些问题&#xff0c;本文将针对这些问题介绍缓存使用技巧和设计方案。 1缓存的收益和成本 下图左侧为客户端直接调用存储层的架…

【C++】STL---string

string类 一、C语言中的字符串二、string类三、模拟实现 string 类0. string 类的声明1. 构造函数2. 析构函数3. 拷贝构造函数4. 赋值运算符重载5. 迭代器6. 元素访问&#xff1a;[] 重载7. 流插入与流提取重载8. 与容量相关的接口&#xff08;1&#xff09;size&#xff08;2&…

使用CST仿真软件完成单站雷达目标RCS仿真

第一步&#xff1a;新建模版 第二步&#xff1a;选择微波与射频/光学应用 第三步&#xff1a;选择雷达应用 第四步&#xff1a;选择单站雷达静态RCS 第五步&#xff1a;选择小目标工作流。&#xff08;这里的小目标要求小于10倍波长&#xff0c;否则需要选大目标工作流&#x…

nuxt3 简易教程

代码仓库 https://github.com/malred/nuxt_tutorial https://gitee.com/malguy/nuxt_tutorial 什么是 Nuxt 根据 Vue 官网的说法 而 Nuxt 是由 Vue 官方团队开发的 SSR 框架 创建项目 npx nuxi init todo 项目结构 创建完需要手动安装依赖 cd todo npm i # 启动 npm run dev…

大语言模型之二 GPT发展史简介

得益于数据、模型结构以及并行算力的发展&#xff0c;大语言模型应用现今呈井喷式发展态势&#xff0c;大语言神经网络模型成为了不可忽视的一项技术。 GPT在自然语言处理NLP任务上取得了突破性的进展&#xff0c;扩散模型已经拥有了成为下一代图像生成模型的代表的潜力&#x…