Linux中进程的控制

一、进程的创建

1、知识储备

进程的创建要调用系统接口,头文件 #include<unistd.h> 函数fork()

由于之前的铺垫我们现在可以更新一个概念

进程 = 内核数据结构(task_struct, mm_struct, 页表....)+ 代码 + 数据

所以如何理解进程的独立性呢?

就是上述组成进程的结构都是独立的,互不影响的。

那为什么 fork() 返回的是子进程的pid呢?

是为了让父进程对子进程进行表示和管理。

2、理解fork()

(1)fork() 常见用法

a、在一个代码中通过 fork() 不同的返回值用 if else分流,以达到不同进程执行不同代码的目的。

b、可以让父子进程独立进行完全不同的代码。

(2)fork() 失败的原因

a、操作系统中进程太多。

b、实际用户创建的进程太多,超出规定个数。

二、进程的终止

首先我们要知道进程是先创建内核数据结构,再加载代码和数据。

1、终止的表现

会释放代码和数据所占据的空间,释放内核数据结构(task_struct 会延期释放)

2、终止的三种情况

(1)观察现象

首先我们先观察一个现象

当我们以前在写c语言代码时,我们都是 return 0; 结尾,当我们今天 return 100; 时,用 echo $? 命令获取进程的退出码时,就会发现退出码和 return 后面的数字是一样的。

(2)解释 echo $?

echo:内建命令,打印bash内部变量数据。

$:访问变量内容。

?:父进程bash获取最近一个子进程的退出码。

(3)退出码

退出码0是成功,非0是失败。

每一个非0数都有不同的失败原因。

头文件 #include<string.h>    函数 char* strerror(int num) 可以查看退出码。

上图只截了一部分退出码。

退出码的作用就是告诉父进程,子进程把任务完成的怎么样。

结论:当代码跑完时,结果的正确与否是由退出码反馈给用户的。

(4)退出信号

与退出码不同,退出信号是代码还没跑完,系统就崩溃了(操作系统发现进程做了不该做的事,比如访问野指针等等),操作系统就会杀死进程。

所以一旦出现异常,退出码也就没有意义了,但是返回的退出信号是有意义的。

例如:Segmentation fault 就是段错误,代码段是有错误的。

退出信号的本质:操作系统给进程发信号并终止进程。

之前我们说kill -9 可以直接杀死进程也就是这个原因,而我们上面提到的段错误 Segmentation fault 就是操作系统发送了 kill -11 信号。

(5)总结

衡量一个进程的退出,只要看退出码和退出信号。

先确认是否异常,若不是才看退出码。

所以在子进程的 task_struct 中就会有 exit_code(退出码)  exit_signal(退出信号),在执行完代码后写入退出码和退出信号供父进程读取。

3、如何终止

(1)main()函数中的 return 代表进程终止(普通函数 return 表示函数结束)

(2)调用头文件#include<stdlib.h> 函数 void exit(int status) status相当于退出码,exit等价于return

(3)调用头文件#include<unistd.h> 函数 void _exit(int status),基本与exit函数相同,一个是c库函数,一个是系统调用。

区别

exit 执行时会冲刷缓冲区,但是 _exit不会,所以其实这里所说的缓冲区只是c库层面的,不是系统调用层面的缓冲区。

exit本质就是底层调用 _exit

三、进程等待

任何子进程在退出的情况下必须要被父进程等待。如果父进程不管,子进程就会处于僵尸状态,导致内存泄漏。

三、进程的等待

1、为什么父进程要等待子进程

(1)解决僵尸问题,回收系统资源。(必须)

(2)获取子进程退出信息,知道子进程为什么退出。(可选)

2、怎么等待

(1)wait 函数

头文件 #include<sys/types.h> #include<sys/wait.h>

函数 pid_t wait(int* status)

等待成功返回子进程的pid,wait(NULL)表示父进程等待任意一个子进程退出。

若子进程一直不退出,父进程就进入阻塞等待。

阻塞等待的本质:把父进程设为非运行状态(S),链入到子进程队列中,子进程退出,父进程唤醒。

(2)waitpid 函数

头文件 #include<sys/types.h> #include<sys/wait.h>

函数 pid_t waitpid(pid_t id, int* status, int options)

waitpid(-1, NULL, 0)等价于wait(NULL)

a、理解参数 id

id 表示要等待哪个子进程

所以理解代码:

pid_t id = fork();

waitpid(id, NULL, 0);

在父进程中fork()返回子进程pid,所以就指定了要返回哪个子进程了。

b、理解参数 status

status是输出型参数(例如 scanf(),就是把数值写入到一个变量中),输出的是退出信息(包括退出码和退出信号)

理解额代码:

我们知道int有32位bit位,status只考虑低16位

获取退出码:(status>>8) & 0xFF

获取退出信息:status & 0x7F

c、获取退出码的宏

WIFEXITED(status)     代码正常走完就返回真

WEXITSTATUS(status)    若WIFEXITED为真就提取退出码

(3)非阻塞等待

上述父进程都是等子进程跑完之后才工作的,这种都是阻塞等待,调用waitpid默认也是阻塞等待,但是我们想让父进程在等待时做其他事情,就要让 waitpid 中 option 设成 WNOHANG

此时返回值 < 0:等待失败。

返回值 = 0:检测成功,但是子进程未退出,等待下一次检测。

返回值 > 0:等待成功,并且父进程回收成功。

非阻塞等待 + 循环 = 非阻塞轮询

达到父进程能做其他事情。

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

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

相关文章

最新 Docker 下载镜像超时解决方案:Docker proxy

现在Docker换源也下载失败太常见了&#xff0c;至于原因&#xff0c;大家懂得都懂。本文提供一种简洁的方案&#xff0c; 利用 Docker 的http-proxy&#xff0c;代理至本机的 proxy。 文章目录 前言Docker proxy 前言 这里默认你会安装 clash&#xff0c;然后有配置和数据库。…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

开机出现grub无法进入系统_电脑开机出现grub解决方法

最近有小伙伴问我电脑开机出现grub无法进入系统怎么回事&#xff1f;电脑开机出grub的情况有很多&#xff0c;电脑上安装了Linux和Win10双系统&#xff0c;但是由于格式化删除了Linux之后&#xff0c;结果win10开机了之后&#xff0c;直接显示grub&#xff1e;&#xff0c;无法…

平面五杆机构运动学仿真matlab simulink

1、内容简介 略 89-可以交流、咨询、答疑 2、内容说明 略 ] 以 MATLAB 程序设计语言为平台 , 以平面可调五杆机构为主要研究对象 , 给定机构的尺寸参数 , 列出所 要分析机构的闭环矢量方程 , 使用 MATLAB 软件中 SIMULINK 仿真工具 , 在 SIMULINK 模型窗口下建立数…

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…

(MLLMs)多模态大模型论文分享(1)

Multimodal Large Language Models: A Survey 摘要&#xff1a;多模态语言模型的探索集成了多种数据类型&#xff0c;如图像、文本、语言、音频和其他异构性。虽然最新的大型语言模型在基于文本的任务中表现出色&#xff0c;但它们往往难以理解和处理其他数据类型。多模态模型…

“探求新质生产力 推进中国式现代化”学习交流活动在河北廊坊举办

7月21日&#xff0c;一场以“探求新质生产力 推进中国式现代化”为主题的学习交流活动在河北省廊坊市举办&#xff0c;2000余名企业界人士共同探讨企业发展的新路径与新动力。 7月21日&#xff0c;“探求新质生产力 推进中国式现代化”学习交流活动在河北省廊坊市举办。图为活动…

primeflex教学笔记20240720, FastAPI+Vue3+PrimeVue前后端分离开发

练习 先实现基本的页面结构: 代码如下: <template><div class="flex p-3 bg-gray-100 gap-3"><div class="w-20rem h-12rem bg-indigo-200 flex justify-content-center align-items-center text-white text-5xl"><input type=&q…

前端Vue组件化实践:自定义发送短信验证码弹框组件

在前端开发中&#xff0c;随着业务逻辑的日益复杂和交互需求的不断增长&#xff0c;传统的整体式开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些问题&#xff0c;组件化开发成为了一种流行的解决方案。通过组件化&#xff0c;我们可以将复杂的系统拆分成多个独立的…

JMeter:BeanShell到JSR223迁移中的注意事项

前言 在之前的文章JMeter&#xff1a;BeanShell向JSR223迁移过程遭遇的java标准库不可用问题-如何切换JDK版本中引用了一段使用BeanShell对入参进行加密的脚本&#xff0c;迁移到JSR223&#xff0c;虽然更换JDK后编译通过&#xff0c;看似也可以执行了&#xff0c;但是其实那段…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

Linux 13:网络编程1

1. 预备知识 1-1. 理解源IP地址和目的IP地址 在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址&#xff0c;和目的IP地址。 我们光有IP地址就可以完成通信了嘛&#xff1f;想象一下发qq消息的例子&#xff0c;有了IP地址能够把消息发送到对方的…

[嵌入式Linux]-常见编译框架与软件包组成

嵌入式常见编译框架与软件包组成 1.嵌入式开发准备工作 主芯片资料包括&#xff1a; 主芯片资料 主芯片开发参考手册&#xff1b;主芯片数据手册&#xff1b;主芯片规格书&#xff1b; 硬件参考 主芯片硬件设计参考资料&#xff1b;主芯片配套公板硬件工程&#xff1b; 软件…

Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 步骤1: 数据准备 收集和整理历史数据。确保数据集经过适当的预处理,如归一…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接&#xff0c;问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单&#xff0c;于是说我抽空看看。然后就分析目标网页&#xff0c;试图从网页源码里找出连接&#xff0c;有的源代码直接有,但是有的没有…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好&#xff0c;办公人…

golang 解压带密码的zip包

目录 Zip文件详解ZIP 文件格式主要特性常用算法Zip格式结构图总览Zip文件结构详解数据区本地文件头文件数据文件描述 中央目录记录区&#xff08;核心目录记录区 &#xff09;中央目录记录尾部区 压缩包解压过程方式1 通过解析中央目录区来解压方式2 通过读取本地文件头来解压两…

mq基础入门

前言 黑马商城导入了mq依赖 但是没有改service发消息 因为下单业务一直有问题 所以先没改 作业时间不够也没处理 1.异步调用 就是所谓的发短信 可以不用立即恢复 比如下单业务 下了单更新信息 就相当于发个消息通知一下 不用立即更改 但是支付就比较重要 不需要因为故障导…

谷粒商城实战笔记-48~49-商品服务-API-三级分类-查询-树形展示三级分类数据-前端优化

文章目录 一&#xff0c;48-商品服务-API-三级分类-查询-树形展示三级分类数据1&#xff0c;创建商品服务命名空间2&#xff0c;商品服务增加配置3&#xff0c;网关增加商品服务的路由配置4&#xff0c;前端树形展示5&#xff0c;测试 二&#xff0c;49-商品服务-API-三级分类-…

Prometheus配置alertmanager告警

1、拉取镜像并运行 1、配置docker镜像源 [rootlocalhost ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://dfaad.mirror.aliyuncs.com"] } [rootlocalhost ~]# systemctl daemon-reload [rootlocalhost ~]# systemctl restart docker2、…