系统编程__2__父子进程的创建和回收

2023-05-16

系统编程

这里写的是对于小白来说更多的了解系统编程的文章,有写的不对的地方还恳请各位大佬指出错误,小编一定会多多采纳[手动多谢]。
那么,上一次我们稍微了解了一下关于系统编程的一些主要内容[没有看到的童鞋还请去上一篇文章稍微复习一下噢]。
这节课,我们先来想一想,我们为什么要学系统编程呢?原因很简单,我们要充分的利用CPU的性能,CPU和我们人类不太一样,我们人类大多数情况下,在同一时间,只能完成一件事,而CPU作为无数科学家的心血当然不会这么简单,CPU能够同时进行多个进程,这里的进程我们可以理解成任务,再说的生动形象一点,就是CPU可以在做饭的时候同时可以洗衣服,那么这是怎么完成这一系列的操作呢,咳咳,这里我们不进入深入了解,毕竟我们也是站在无数巨人的肩膀上进行开发的嘛,我们需要知道的是,怎么调用接口函数,使得CPU可以同时进行多个任务。

介绍一下关于父子进程和进程的ID号(注意父子进程只是进程间的其中一种关系):有血缘关系的进程(这里知道有这个概念就好,不必过于深究)
父进程:我们调用fork这个函数,创建出来的是子进程,调用fork的进程就是父进程。
子进程:fork产生的进程。
ID号:每个进程系统都会分配一个ID号,用来区分不同进程。

重点来了,父子进程的接口函数:

进程的创建:pid_t fork (void)
			返回值共有三种情况:>0 ;父进程的返回值,此时返回值为创建成功的那个子进程的ID号。
			=0;子进程的返回值
			<0;   创建进程失败
			注意:1.fork函数与以往我们使用的函数不一样,fork函数一次调用两次返回,即父,子进程各有一次返回值。
						2.fork函数调用之后父进程与子进程的操作是独立的,原因是因为当调用fork函数之后,系统会向
						内存生请一段和源码相同大小的内存空间,并将源码完整的复制过去(相似度为99。9%),这段内存用来
						运行fork产生的子进程,比如设置全局变量int a,在父进程中有a=4 ,子进程中a=3,则这段代码中
						a同时有两个值,父进程中有a=4 ,子进程中a=3 
						。

和文件IO类似,进程有着回收的步骤(这里只讲父子进程)。
在介绍进程回收之前,我们还得了解了解cpu的调度策略:

首先,我们了解了解什么是孤儿进程:

孤儿进程:又称僵尸进程,对于父子进程来说产生孤儿进程的原因是,父进程先于子进程退出,导致子进程无人回收,子进程就
变成了孤儿进程(重点)
进程的组成:数据段,代码段,进程控制块(PCB->process control block)
进程控制块:指的是系统中定义的一块结构体,该结构体用于储存进程运行时候的状态信息。(这里的概念了解了解就行)

我们再了解了解,孤儿进程有什么坏处:

坏处1:孤儿进程无法回收,占用cup内存.
坏处2:孤儿进程无法普通方法无法终止,可能造成像病毒一样的视觉效果。

进程的退出:

退出进程: void exit  (int status);
					void _exit (int status);

进程的回收:

进程回收:包含的头文件:#include<sys/wait.h>
					pid_t wait (int * wstatus)
					返回值:成功, 返回回收的那个子进程的ID号
						   失败: -1 ;
						   参数:wstatus -->用于保存进程退出时,状态信息(包括退出值)exit退出的仅仅是一部分。
						   
					pid_t waitpid (pid_t pid ,int * wstatus,int options);
					返回值:成功返回回收的子进程的ID号
					失败:-1 ;
				    参数:pid  -->waitpid (-10002);//我要回收 进程组ID为10002里的某个子进程.
				    waitpid (-1);//我要回收任意一个子进程
				    waitpid (0);//我要回收任意一个子进程
				    waitpid (20000)//我要回收ID号为20000的进程
				    options->WNOHANG //非阻塞等待(父进程退出时,若子进程还没结束,那么父进程不阻塞等待,直接结束)。
				    	   ->阻塞等待

在很多时候我们都需要知道各个进程的ID号,比如,当想要回收某个确定的进程时,所以由此引出获取各个进程的ID号的函数,例:

		pid_t getpid (void)
		返回值:当前进程ID号
		
		pid_t getppid(void)
		返回值:当前父进程ID号
		
		pid_t getgrp(void)
		返回值:当前进程所属进程组ID号

下面介绍一下各种关于进程退出时可以利用进程退出值进行判断的宏定义(不用背,要用的时侯找出来用就行)

WIFEXITED(status)//如果子进程正常退出,则该宏为真。
WEXITSTATUS(status)//如果子进程正常退出,则该宏将获取子进程退出值。	
WCOREDUMP(status)//如果子进程被信号杀死且生成核心转储文件(core,dump),则该宏为真。
WTERMSIG (status)//如果子进程被信号杀死,该宏获取导致他死亡信号值
WIFSTOPPED(status)//如果子进程被信号暂停,且option中			WUNTRACED已被设置,为真。
WSTOPSIG(status)//如果WIFSYOPPEN(status)为真,则该宏将获取导致子进程暂停的信号值。
WIFCONTINUED(status),如果子进程被信号SIGONT重新置为就绪态,该宏为真。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统编程__2__父子进程的创建和回收 的相关文章

随机推荐

  • 怒飞垂云视频教程 一、建立编译环境

    本文讲述如何建立APM飞控固件的编译环境 原文链接 xff1a http www nufeichuiyun com p 61 237
  • Android Automotive(七) VehicleService

    Android Automotive xff08 七 xff09 VehicleService VehicleService 是Android Automotive在硬件抽象层的一个核心native服务 处理和车辆相关功能 xff0c 为系
  • ardupilot之添加mavlink消息

    本文是这篇文章的复现 xff1a http www sohu com a 213599378 175233 一 mavlink分析 Mavlink 的全称是Micro Air Vehicle link xff0c pixhawk把它作为与地
  • Linux中断机制:硬件处理,初始化和中断处理

    来源 CSDN phenix lord的专栏 硬件处理 最近解决一个关于Linux中断的问题 xff0c 把相关机制整理了一遍 xff0c 记录在此 不同的外部设备 不同的体系结构 不同的OS其中断实现机制都有差别 xff0c 本文对应的O
  • 跟我一起复制一款基于ESP-Drone无人机控制板

    1 ESP Drone 无人机项目简介 ESP 无人机是基于ESPRESIF ESP32 ESP32 S2 Wi Fi芯片的开源解决方案 xff0c 可通过Wi Fi连接到手机应用程序或游戏控制台 ESP无人机具有简单的硬件 清晰和可扩展的
  • linux安装llvm

    先装cmake xff0c 可以用sudo apt get install cmake或者去官网下载源码编译安装 下载llvm git clone https github com llvm llvm project git 3 Build
  • Makefile中的MAKECMDGOALS

    make 在执行时会设置一个特殊变量 xff1a 34 MAKECMDGOALS 34 xff0c 该变量记录了命令行参数指定的终极目标列表 xff0c 没有通过参数指定终极目标时此变量为空 该变量仅限于用在特殊场合 比如判断 xff0c
  • Docker切换存放目录踩坑

    因为 var 目录下的磁盘空间不足 xff0c 故把docker的存放目录切换到 data 下面 xff0c 具体步骤 xff1a 1 编辑docker配置文件 etc docker daemon json xff0c 修改data roo
  • 关于Modelsim SE-64 2020.4取消优化后不显示波形问题

    Modelsim取消优化后报错 Error suppressible vsim 12110 All optimizations are disabled because the novopt option is in effect This
  • 关于串口调试助手XCOM点击发送后卡住问题

    未成功安装CH340驱动 USB串口驱动 安装前先重启电脑 xff0c 再点击安装 串口选择错误 打开设备管理器 xff0c 查看USB连接的端口 xff08 COM xff09 号 xff0c 选择正确的端口 xff08 COM xff0
  • Makefile中Linux转Windows执行知识点

    makefile 是一个自动化编译工具 xff0c 可以简化编译过程 xff0c 自动化处理依赖关系和编译顺序 xff0c 提高了代码的可维护性 makefile 通常由一些规则和命令组成 xff0c 规则由目标 依赖和命令构成 xff0c
  • darknet2ncnn编译中 libopencv 库文件找不到

    问题描述 没有直接从 github 上下载 darknet2ncnn 包 xff0c 用的是他人提供的包 xff0c 包已经编译好 解压已经有 convert verify 文件 执行该文件 xff0c 问题描述如下 xff1a root
  • linux usb设备如何和u盘对应

    已知 usb 的 pid vid 如何对加载的u盘进行管理 思路 xff0c 找到 U盘的厂商信息中的pid和 vid 对应关系 xff0c 然后控制 U盘的加载 但是 U盘信息中没有pid 和 vid root 64 li PC sys
  • CV面试题(持续更新!!!)

    CV面试题 1 反卷积 反卷积又叫做转置卷积 xff0c 在计算机中计算的时候 xff0c 转置卷积先将卷积核转为稀疏矩阵C的形式 xff0c 然后计算的时候正向传播的时候左乘这个稀疏矩阵C的转置 xff0c 反向传播的时候左乘这个稀疏矩阵
  • 程序运行时数据保存位置

    程序运行时 xff0c 内存中有六个地方可以保存数据 1 寄存器 这是最快的保存区域 xff0c 寄存器位于处理器内部 然而寄存器的数量很有限 xff0c 所以寄存器是根据需要由编译器的分配的 我们对此没有直接的控制权限 也不可能在我们的程
  • ESP-Drone无人机控制板设计的第一个任务---绘制ESP32-S2-WROVER模块及周边电路

    第1步 xff0c 查看官方ESP Drone无人机ESP32 S2 WROVER模块的参考设计原理图 第二步 xff0c 用KiCAD绘制ESP32 S2 WROVER模块及周边电路 1 如图2 1所示 xff0c 从KiCAD的原理图符
  • ROS学习——读取摄像头数据image

    在ROS工作空间的src文件夹下创建read camera功能包 xff0c 并在包内创建include launch src cfg四个文件夹 在cfg文件夹中创建param yaml文件 xff0c 并写入以下内容 xff1a imag
  • ROS学习——控制小车转向

    给定一个旋转的角度 xff0c 让小车进行顺时针或逆时针旋转 span class token macro property span class token directive keyword include span span clas
  • PID参数设定

    在电机的控制领域 xff0c 不同的电机有不同的驱动方式 xff0c 其中应用最广泛的就是PID proportion integration differentiation 控制 P I和D分别指比例控制 xff0c 积分控制和微分控制
  • 系统编程__2__父子进程的创建和回收

    系统编程 这里写的是对于小白来说更多的了解系统编程的文章 xff0c 有写的不对的地方还恳请各位大佬指出错误 xff0c 小编一定会多多采纳 手动多谢 那么 xff0c 上一次我们稍微了解了一下关于系统编程的一些主要内容 没有看到的童鞋还请