操作系统——进程控制
创建进程
fork
fork是一个系统调用函数,用来创建子进程,通过多个执行流完成任务。子进程和父进程共用一份代码,子进程数据使用写时拷贝,即子进程数据在创建的时候和父进程相同,但是当要修改数据的时候,子进程数据会再复制一份数据。
函数无参,返回值pid_t是用有符号整形封装的。
函数返回值,如果创建成功,父进程就返回子进程的pid,子进程返回0,如果创建失败就返回-1
循环创建多个进程
1 #include <stdlib.h>2 #include <stdio.h>3 #include <unistd.h>4 5 void run()6 {7 while(1)8 {9 printf("child pid:%d\n",getpid());10 sleep(1);11 }12 }13 14 int main()15 {16 pid_t id;17 int i;18 for(i = 0; i < 5; i++)19 {20 id = fork();21 if(id == 0)22 {23 run();24 exit(0);25 }26 }27 sleep(1000);28 return 0;29 }
终止进程
进程终止有三种情况:
1.结果正确,返回
2.结果错误,返回
3.程序异常
进程运行结束返回值可以使用return,exit(),_exit()。程序异常一般是外部发给程序一个信号,程序异常终止
正常终止
return,exit(),_exit()三者的区别是什么?
return和exit()
在main函数中,return和exit都可以让进程结束;在一般函数中,return只是让函数返回,继续运行,而exit会直接终止进程
exit()和_exit()
_exit是系统调用接口,直接终止程序;exit调用了_exit,并且会先刷新缓冲区做一些清理工作。
因为printf内容不加\n不会刷新缓冲区,不会打印出来
异常终止
写一个死循环让程序一直运行
这里向程序发送Floating Point exception异常信号
程序收到信号后,异常终止
进程等待
当子进程还没有退出,父进程就要退出时,如果父进程不等待子进程直接退出,就会让子进程变为僵尸进程造成内存泄漏。因此我们需要用进程等待的方式获取子进程的运行状态以及退出码。
介绍两个系统调用接口:
wait和waitpid
waitpid的功能包含了wait,我们先说waitpid
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid表示子进程的pid:
-1表示等待任何子进程,和wait一样后面讲
>0表示等待子进程为pid的进程
status是一个输出型参数:
int有32bit,前16位是有效位。前七位是终止信号,如果程序异常终止就会将信号保存到这里;第八位是core dump标志;8-16位是退出码
WIFEXITED
(status)可以判断子进程是否正常结束
- 如果子进程正常结束(通过
exit
调用或从主函数返回),WIFEXITED
返回非零值(真) - 如果子进程是由于其他原因结束(如信号),则返回零值(假)
WEXITSTATUS(status)
可以用来获取子进程传递给 exit()
的实际退出值
option是用来修改waitpid行为的选项
没传参时默认为阻塞轮询,即父进程必须等待子进程结束才继续执行
传 WNOHANG 表示非阻塞轮询,父进程获取子进程状态后不论子进程是否结束都会先执行自己的代码。如果子进程结束返回子进程pid;如果未结束返回0
返回值
>0表示子进程正常结束,返回子进程pid
0 表示子进程还未结束
<0表示子进程异常结束
阻塞轮询:
1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <sys/wait.h>5 #include <stdlib.h>6 7 int main()8 {9 for(int i = 0; i < 5; i++)10 {11 pid_t id = fork();12 if(id == 0)13 {14 printf("child pid:%d\n", getpid());15 sleep(1);16 exit(0);17 }18 }19 20 sleep(5);21 22 int status = 0;23 for(int i = 0; i < 5; i++)24 {25 pid_t ret = waitpid(-1, &status, 0);26 if(ret > 0)27 {28 printf("wait success pid:%d\n", ret);29 sleep(1);30 }31 }32 return 0;33 sleep(5);34 }
运行结果
运行过程的进程监视
阻塞轮询:
1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <sys/wait.h>5 #include <stdlib.h>6 #include <errno.h>7 #include <string.h>8 9 int main()10 {11 //非阻塞轮询12 13 pid_t id = fork();14 if(id == 0)15 {16 //child17 printf("child pid:%d, ppid:%d\n", getpid(), getppid());18 //测试异常19 //int* p = NULL;20 //*p = 1;21 sleep(10);22 exit(1);23 } 24 else if(id > 0) 25 { 26 int status;27 //father 28 while(1) 29 { 30 pid_t ret = waitpid(id, &status,WNOHANG); 31 if(ret == id) 32 {33 if(WIFEXITED(status)) 34 { 35 //正常结束36 printf("wait success, exit code:%d\n", WEXITSTATUS(status));37 break; 38 } 39 } 40 else if(ret < 0) 41 { 42 //异常 43 printf("wait fail,%s\n",strerror(status & 0x7f));44 break; 45 } 46 else 47 { 48 //子进程还在执行49 printf("child running,wait a minute\n");50 sleep(1);51 }52 }53 }
正常结束
异常结束
相关文章:

操作系统——进程控制
创建进程 fork fork是一个系统调用函数,用来创建子进程,通过多个执行流完成任务。子进程和父进程共用一份代码,子进程数据使用写时拷贝,即子进程数据在创建的时候和父进程相同,但是当要修改数据的时候,子进…...

Marin说PCB之国产电源芯片方案 ---STC2620Q
随着小米加入的造车大家庭,让这个本来就卷的要死的造车大家庭更加卷了。随之带来的蝴蝶效应就是江湖上各个造成门派都开始了降本方案的浪潮啊,开始打响价格战了。各家的新能源车企也是不得不开始启动了降本方案的计划了,为了应对降价的浪潮。…...
已解决java.lang.StringIndexOutOfBoundsException: 字符串索引越界异常的正确解决方法,亲测有效!!!
已解决java.lang.StringIndexOutOfBoundsException: 字符串索引越界异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 检查索引范围 检查字符串长度 管理循环中的索引 总结 问题分析 java.lan…...
关于实体类注解@Data、@EqualsAndHashCode(callSuper = true)、@Accessors(chain = true)的作用
笔记:都是lombook插件的注解,作用是简化优化代码等,比如getter、setter,一般三者连用能避免一些如继承类的导致的一些坑,比如equal()方法的错误,具体用法可查阅每个注解及属性的作用。 Accessors(chain tr…...

5.9号模拟前端面试10问
5.9号模拟前端面试10问 1.html语义化的理解 HTML语义化是指使用具有明确含义的HTML标签来描述内容,而不仅仅是使用<div>和<span>等通用容器标签。语义化的HTML代码更易于阅读和维护,同时也有助于搜索引擎优化(SEO)。…...
vue3 JSX的使用与警告【JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“】解决办法
一、安装 pnpm i vitejs/plugin-vue-jsx -D 二、配置 1、tsconfig.json "compilerOptions":{"jsx":"preserve" } 2、vite.config.ts import VueJsx from "vitejs/plugin-vue-jsx"...plugin:[vue(),VueJsx() ] 三、简单使用案例…...

一、计算机基础(Java零基础一)
🌻🌻目录 一、🌻🌻剖析学习Java前的疑问🌻🌻1.1 零基础学习编程1.2 英语不好能学吗?1.3 理解慢能学好吗?1.4 现在学Java晚吗?1.5 Java 和 Python 还有 Go 的选择1.6 Java…...

德国著名自动化公司Festo设计了一款仿生蜜蜂,仅重34g,支持多只蜜蜂编队飞行!...
德国著名的气动元件研发及自动化解决方案供应商Festo公司近日展示了一款仿生蜜蜂(BionicBee),重量只有34g,却完全可以实现自主飞行,还支持多只相同的蜜蜂机器人编队飞行。 BionicBee 重约 34 克,长 22 厘米…...
折腾记:C++用开源库Snap7通过S7协议连接西门子PLC
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 不是教程,是避坑指…...

Android studio 新版本 NewUI toolbar显示快捷按钮
新版本的Android studio 启用新的界面,以前许多快捷按键位置有变化 文章目录 设置始终显示主菜单设置ToolBar快捷按钮显示设置右下角显示分支 设置始终显示主菜单 原本要点击左上角几个横向才显示的菜单 设置始终显示,View -> Appearance -> Mai…...
辛普森公式求函数的近似积分【通用计算】
利用辛普森公式可以近似求出复杂函数的积分值,公式如下: ∫ a b f ( x ) d x ≈ h 3 [ y 0 y 2 n − 1 4 ( ∑ i 1 n − 1 y 2 i − 1 ) ∑ i 1 n − 1 y 2 i ] \int_{a}^{b} f(x) dx \approx \frac{h}{3}\left[ y_0 y_{2n-1} 4(\sum\limits_{i1…...

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

多线程学习D10 收尾了应该
线程安全集合类概述 重点介绍java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:Blocking、CopyOnWrite、Concurrent Blocking 大部分实现基于锁,并提供用来阻塞的方法 CopyOnWrite 之类容器修改…...

ai可以做思维导图吗?当然是可以的!
ai可以做思维导图吗?在快节奏的现代生活中,思维导图作为一种高效的信息组织和表达工具,越来越受到人们的青睐。随着人工智能(AI)技术的不断发展,AI思维导图软件也应运而生,它们不仅能够帮助用户…...

景源畅信数字:抖音小店的入住门槛大不大?
近年来,随着短视频平台的崛起,抖音小店逐渐成为了众多商家和创业者关注的焦点。那么,抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单,只需按照官方指引完成…...

鸿蒙开发-ArkTS语言-容器-非线性容器
鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…...

【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、简单介绍Sizeof和Strlen1.1 Sizeof1.2 Strlen函数1.3 Sie…...
【设计模式】单例模式的前世今生
文章目录 引言简介起航!向“确保某个类在系统中只有一个实例”进发 ⛵️Lazy SingletonDouble-checked locking(DCL) SingletonVolatile SingletonAtomic SingletonMeyers Singleton 附:C静态对象的初始化 引言 说起单例模式&…...
厦门网上在线教育系统,线下老师怎么转型到线上网上授课?
现在很多 线下老师都想转到线上做网课,但是在转线上过程中会出现很多问题,很多人都不知道怎么开始,今天小编和大家说一下要注意的。 一、你要有一套适合线上的教学视频 首先你要准备做的课程内容是什么,怎么讲,讲什么&…...

Spring底层入门(九)
boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...