进程控制(linux+C/C++)

news2025/4/22 13:06:30

目录

进程创建

写时拷贝

fork

进程终止

退出码

进程退出三种情况对应退出信号 :退出码:

进程退出方法

进程等待

两种方式

阻塞等待和非阻塞等待

小知识


进程创建

1.在未创建子进程时,父进程页表对于数据权限为读写,对于代码权限为只读。

 

  2.在创建子进程后

父子进程都变为只读

3.在修改父子进程数据时,操作系统就会“报错”:

分情况:1.如果是野指针等非法情况,终止进程

2.如果是合法的,进行写时拷贝+更改父子进程权限为读写

写时拷贝

好处:因为不一定会修改子进程的所有数据,写时拷贝是按需拷贝,这样节省了时间与空间效率。

fork

常规用法:

1.一个父进程希望复制自己,使父子进程同时执行不同的代码段。

2.子进程要执行一个不同的程序。

失败原因:

1.系统中有过多进程

2.用户的进程数是有限制的。

进程终止

退出码

进程退出时会有退出码,比如return 的数字,退出码会被系统获得,让系统得知该进程执行情况。

 

$?获取最近一个退出进程的退出码的命令,使用echo打印

 

0代表程序执行成功,非零表示程序运行失败,不同的值代表不同失败原因。

strerror可以打印出内置错误码对应的错误信息(内置错误码不止100个),错误码可以自定义。

进程退出三种情况对应退出信号 :退出码:

进程退出信号:操作系统发送给进程以通知其终止或执行特定操作的信号。

1.代码运行完,结果正确     0:0

2.代码运行完,结果不正确   0:非零

3.代码运行失败,进程异常   非零:非零

进程退出方法

1.return 退出码      由main函数执行。   return 表示函数调用结束,对于main函数表示进程结束

2.exit(退出码)    直接调用C语言库函数     会主动刷新缓冲区再结束进程,调用后进程结束。

3._exit(退出码)    系统调用    直接终止进程,不会刷新缓冲区。

 exit其实是调用的_exit,是对其的封装

结论:

1.进程终止必定调用系统调用

2.操作系统会知道异常的进程,并通过信号杀掉。

3.输出缓冲区在库中(库缓冲区),而不在OS火系统调用中。

进程等待

就是让父进程通过等待的方式,回收子进程的PCB,如果需要,获取子进程的退出信息。

因为如果父进程对子进程不进行管理,子进程会成为僵尸进程,造成内存泄漏,僵尸进程无法杀死,只能靠父进程回收。

两种方式

头文件:<sys/wait.h>

wait和waitpid 本质是获得子进程的task_struct中的退出属性,调用完毕,会让OS释放task_struct

pid_t wait(int *status)

wait成功,返回子进程pid,失败返回-1(该进程无子进程)。

pid_t waitpid(pid_t pid,int* status,int options)        这个比较好用

status的0~6位表示进程退出信号,8~15为表示进程退出码,7位表示coredump()标志位,

退出码可以使用(status>>8)&0xFF得到,退出信号可以使用status&0x7F得到。

阻塞等待和非阻塞等待

阻塞等待指如果子进程未退出,父进程会进入阻塞状态,等待子进程退出。

非阻塞等待是WNOHANG,在waitpid函数中options位置使用,指如果子进程未退出,直接返回0,如果子进程退出,返回>0的值,如果等待的子进程不是该父进程的子进程或该子进程不存在,返回<0的值。

本质是检测子进程状态,不会卡住父进程,让父进程可以在等待事件间隙中做其他事情,所以非阻塞等待会更高效 

非阻塞轮询方案:多次非阻塞等待

小知识

1.在malloc和new时,是先开辟虚拟地址空间,等到使用时,再进行物理内存申请,构建完整映射关系,所以其也为惰性申请

2.在task_struct中,有存退出码的成员

3.执行进程时CPU从寄存器中取的是虚拟地址。

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

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

相关文章

TensorBoard如何在同一图表中绘制多个线条

1. 使用不同的日志目录 TensorBoard 会根据日志文件所在的目录来区分不同的运行。可以为每次运行指定一个独立的日志目录&#xff0c;TensorBoard 会自动将这些目录中的数据加载并显示为不同的运行。 示例&#xff08;TensorFlow&#xff09;&#xff1a; import tensorflow…

微软Entra新安全功能引发大规模账户锁定事件

误报触发大规模锁定 多家机构的Windows管理员报告称&#xff0c;微软Entra ID新推出的"MACE"&#xff08;泄露凭证检测应用&#xff09;功能在部署过程中产生大量误报&#xff0c;导致用户账户被大规模锁定。这些警报和锁定始于昨夜&#xff0c;部分管理员认为属于误…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍

目录 1.进程间通信概述 1.1进程通信的主要方式 1.2进程通信的核心对比 2.信号 2.1 信号的概述 2.1.1 信号的概念 2.2信号的核心特性 2.3信号的产生来源 2.4信号的处理流程 2.5关键系统调用与函数 2.6常见信号的分类及说明 2.6.1. 标准信号&#xff08;Standard Sig…

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师&#xff1a;Ubuntu智能服务停止与清理脚本深度解析 服务展示&#xff1a; 运行脚本&#xff1a; 剩余服务&#xff1a; 一、脚本设计背景与核心价值 在Linux服务器运维中&#xff0c;服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中&#xff0c;高度&#xff08;Height&#xff09;和深度&#xff08;Depth&#xff09;是两个容易混淆的概念。本文通过示例和代码实现&#xff0c;帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…

安全协议分析概述

一、概念 安全协议&#xff08;security protocol&#xff09;&#xff0c;又称密码协议。是以密码学为基础的消息交换协议&#xff0c;在网络中提供各种安全服务。&#xff08;为解决网络中的现实问题、满足安全需求&#xff09; 1.1 一些名词 那什么是协议呢&#xff1f; …

基础学习:(7)nanoGPT 剩下的细节

文章目录 前言3 继续巴拉结构3.1 encode 和 embedding3.2 全局layernorm3.3 lm_head(language modeling) 和 softmax3.4 softmax 和 linear 之间的 temperature和topk3.5 weight tying 前言 在 基础学习&#xff1a;&#xff08;6&#xff09;中, 在运行和训练代码基础上,向代…

Spark-SQL连接Hive总结及实验

一、核心模式与配置要点 1. 内嵌Hive 无需额外配置&#xff0c;直接使用&#xff0c;但生产环境中几乎不使用。 2. 外部Hive&#xff08;spark-shell连接&#xff09; 配置文件&#xff1a;将hive-site.xml&#xff08;修改数据库连接为node01&#xff09;、core-site.xml、…

Linux Wlan-四次握手(eapol)框架流程

协议基础 基于 IEEE 802.1X 标准实现的协议 抓包基础 使用上一章文章的TPLINK wn722n v1网卡在2.4G 频段抓包&#xff08;v2、v3是不支持混杂模式的&#xff09; eapol的四个交互流程 根据不同的认证模式不同&#xff0c;两者的Auth流程有所不同&#xff0c;但是握手流程基…

web组件和http协议

1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议

软件工程师中级考试-上午知识点总结(下)

6. 知识产权和标准化 软件著作权客体&#xff1a;指的是受软件著作权保护的对象&#xff0c;即计算机程序和相关文档。知识产权具有严格的地域性。不受保护期限制&#xff1a;著名权、修改权、保护作品完整权&#xff1b;注意的是&#xff0c;发表权受保护期限制。专利权在期满…

IO流--字节流详解

IO流 用于读写数据的&#xff08;可以读写文件&#xff0c;或网络中的数据&#xff09; 概述&#xff1a; I指 Input&#xff0c;称为输入流&#xff1a;负责从磁盘或网络上将数据读到内存中去 O指Output&#xff0c;称为输出流&#xff0c;负责写数据出去到网络或磁盘上 因…

Cesium学习笔记——dem/tif地形的分块与加载

前言 在Cesium的学习中&#xff0c;学会读文档十分重要&#xff01;&#xff01;&#xff01;在这里附上Cesium中英文文档1.117。 在Cesium项目中&#xff0c;在平坦坦地球中加入三维地形不仅可以增强真实感与可视化效果&#xff0c;还可以​​提升用户体验与交互性&#xff0c…

Java排序算法百科全书:原理、实现与实战指南

一、排序算法全景视图 1. 算法分类体系 graph TDA[排序算法] --> B[比较排序]A --> C[非比较排序]B --> B1[基本排序]B1 --> B11[冒泡排序]B1 --> B12[选择排序]B1 --> B13[插入排序]B --> B2[高效排序]B2 --> B21[快速排序]B2 --> B22[归并排序]B…

开源脚本分享:用matlab处理ltspice生成的.raw双脉冲数据

Author :PNJIE DATE: 2025/04/21 V0.0 前言 该项目旨在使用Matlab处理LTspice的.raw文件&#xff0c;包括动态计算和绘图&#xff0c;部分脚本基于LTspice2Matlab项目&#xff1a; PeterFeicht/ltspice2matlab: LTspice2Matlab - 将LTspice数据导入MATLAB github地址&#x…

(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)

框架&#xff1a;GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…

Github中项目的公开漏洞合集

前言 最近在搜CVE的时候&#xff0c;意外发现了GitHub Security Advisories。 可能对一些人来说&#xff0c;已经是老东西了。但我还是第一次见到。 觉得挺好用的&#xff0c;就分享出来。 GitHub Security Advisories GitHub Security Advisories 是 GitHub 提供的一项重要…

蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长

2025年4月18日&#xff0c;共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年&#xff0c;曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…