Linux基础5-进程控制1(fork创建子进程,写时拷贝,进程退出)

上篇文章:Linux基础4-进程5(程序地址空间详解)-CSDN博客

本篇重点:fork,写实拷贝,进程退出

目录

一. fork创建子进程

1.1 fork用法

1.2 fork返回值有两个的理解

 二. 进程退出码

2.1 进程退出码

2.2 进程退出码所对应的退出信息 

三. 进程退出

四. 下篇重点:进程退出和阻塞,非阻塞等待

一. fork创建子进程

1.1 fork用法

上篇文章提到,我们可以使用fork来创建一个子进程,详细用法如下:

//所需头文件
#include <unistd.h>//函数原型
pid_t fork(void);//返回值
//成功的情况下,在父进程返回子进程的pid,在子进程中返回0
//失败则会返回-1//子进程不会执行父进程fork之后的代码

fork常用于:

1 一个父进程希望复制自己,让子进程执行不同的代码段(如父进程等待客户端请求,生成子进程来处理收到的请求)

2 一个进程想要执行一个不同的程序,如创建子进程进行exec(进程替换)

1.2 fork返回值有两个的理解

1 为什么父进程返回子进程的pid,而子进程返回0?

        因为fork之后,各自执行自己的代码。各自获得自己的return值

2 为什么通过if,else可以让父子进程同时执行自己的代码?

        如:上篇文章提到的代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int global_value = 100;
int main()
{pid_t id = fork();if(id < 0){printf("fork error!\n");return -1;}else if(id == 0) //子进程{int cnt = 0;while(1){printf("子进程,pid:%d ppid:%d | global_value:%d,&global_value: %p\n",getpid(),getppid(),global_value,&global_value);sleep(1);cnt++;if(cnt == 10){global_value = 1234;printf("子进程已经修改了全局变量!\n");}}}else {//父进程while(1){printf("父进程,pid:%d ppid:%d | global_value:%d,&global_value: %p\n",getpid(),getppid(),global_value,&global_value);sleep(2);}}return 0;
}

我们在上篇文章知道了,父子进程一方写入会发生写实拷贝

        当我们调用了fork之后,return pid的时候就会发生写实拷贝,让父子进程有了不同的返回值,这样一来就能够通过if else 来判断各自的p返回值从而达到执行不同的代码

 二. 进程退出码

2.1 进程退出码

我们知道,一个程序结束之后我们会返回0

我们可以使用 下面这个命令获取上一次进程退出的返回值

echo $?

适当修改代码:

这个值我们称为进程退出码,通过进程退出码我们可以知道进程退出的信息!

进程退出后:

代码执行完了,并且返回了0:说明进程正常执行并且退出

代码执行完了,但是没有返回0:这个时候我们通过进程退出码,来获取相关信息

进程崩溃了,退出码就无意义

如:下例代码,正确返回0,计算失败返回1。由于sum我们最后加了100,所以返回值是1

#include <stdio.h>
#include <unistd.h>int sum(int begin,int end)
{int sum = 0;for(int i = begin; i <= end; i++){sum += i;}sum += 100;return sum;
}int main()
{int ans = sum(1,10);if(ans == 55)return 0;elsereturn 1;
}

 

进程退出的时候,会给出进程退出码,用于标定进程是否正确

那么我们如何设定退出码呢?

如果我们不关心进程退出码的话,直接返回0即可!关心进程退出码,我们返回特定的进程退出码即可

一般用0标定正确返回,非0标定错误。我们使用不同的数字标定不同的退出信息!

对于退出信息,系统的一个进程退出码有一个退出信息。

我们可以自定义退出信息,也可以使用系统设置的退出信息

2.2 进程退出码所对应的退出信息 

我们使用 strerror(进程退出码) 即可获取系统标定的信息!(系统共有134个退出码)

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{//显示进程退出码信息for(int i = 0; i <= 134; i++){printf("%d -> %s\n", i, strerror(i));}return 0;
}

运行结果如下:

 

三. 进程退出

让进程正常退出的方法!

1 main函数返回

2 exit()    函数(C语言库函数)

3 _exit()  系统调用

//exit 所需头文件
#include <stdlib.h>void exit(int status);
//status就是我们想要退出的退出码//_exit 所需头文件
#include <unistd.h>//用法和eixt一样
void _exit(int status);

直接 exit(退出码),即可将该进程退出,并且返回对应的退出码

exit 和 _exit 的区别

exit 终止进程会主动刷新C语言的用户级缓冲区

_exit 由于是系统调用,不会刷新该缓冲区

如:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void f()
{exit(0);
}int main()
{printf("hello yzc!\n");f();while(1) sleep(1); //休眠return -1;
}

四. 下篇重点:进程退出和阻塞,非阻塞等待

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

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

相关文章

用python中的tkinter包实现进度条

python中的tkinter包是一种常见的设计程序的GUI界面用的包。本文主要介绍这里面的一个组件&#xff1a;进度条&#xff08;Progressbar&#xff09;。Tkinter Progressbar里面对进度条组件已经做了一定的介绍&#xff0c;但比较抽象。本文以另一种方式介绍这个组件及其常用用法…

20.使用标准差剔除异常值

标准差剔除异常值 1. 方法2. 示例代码2.1 数据读取与清洗2.2 分段读取数据并绘图2.3 解释2.4 outliers2.5 结果展示 我有个记录数据采集后格式是step_rewards.txt 的文档&#xff0c;里面只有一列数据&#xff0c;10*10000行数据&#xff0c;没有表头&#xff0c;分别代表奖励数…

中科蓝讯修改蓝牙名字:【图文讲解】

本文以市面上一款公板公模的畅销产品为例。K12蓝牙音响。 音响用的芯片是&#xff1a;AB5768E MIC用的芯片是&#xff1a;AB5769A 硬件框架图如下&#xff1a; 芯片修改名字&#xff0c;通过下载工具中的配置进行修改。选择蓝牙配置&#xff0c;然后会出现蓝牙名字&#xff…

旅行包发霉怎么处理 除霉及防霉解决方法

近些年听到很多箱包工厂的心声&#xff0c;为什么箱包旅行包每年都会出现长霉请况呢&#xff1f;长霉了&#xff0c;也就是长毛了&#xff0c;长出那些病菌、真菌、细菌等微生物。经ihaoer防霉人士介绍旅行包长霉处理方法如下&#xff1a; 旅行包长霉的因素 一、旅行包储存在阴…

14、交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小&#xff08;宽度高度&#xff09;注意&#xff1a;返回的数值都不…

【IEEE出版、八大高校联合举办、稳定EI检索】第四届人工智能与智能制造国际研讨会(AIIM 2024,12月20-22日)

第四届人工智能与智能制造国际研讨会&#xff08;AIIM 2024&#xff09; The 4th International Symposium on Artificial Intelligence and Intelligent Manufacturing 2024年12月20-22日 中国成都 重要信息 大会官网&#xff1a;www.isaiim.com 大会时间&#xff1a;202…

朴素贝叶斯算法探讨与实践

引言 和撰写博文[1]的缘由一样&#xff0c;本文是想要在所创设的专栏[2]里把所谓的十大机器学习算法[3]全部过一遍。 朴素贝叶斯算法是传统机器学习里的一种可以被用来进行分类的算法&#xff0c;本文将对其原理进行说明&#xff0c;并基于原理给出一个基于该算法的分类实践。…

《数据在内存中的存储》

内存函数 1. 整数在内存中的存储 &#xff08;1&#xff09;旧识回顾&#xff1a; 之前在学到操作符的时候&#xff0c;我们就学过了下面的内容&#xff1a; 整数的二进制的表示方式有三种&#xff0c;原码、反码、补码 有符号的整数&#xff0c;三种表示方式均有符号位和数…

【路径规划】粒子群算法、遗传算法、差分进化算法、灰狼优化算法、麻雀优化算法(PSO、GA、DE、GWO、SSA)路径规划

摘要 本文探讨了多种智能优化算法在路径规划中的应用&#xff0c;包括粒子群算法&#xff08;PSO&#xff09;、遗传算法&#xff08;GA&#xff09;、差分进化算法&#xff08;DE&#xff09;、灰狼优化算法&#xff08;GWO&#xff09;和麻雀优化算法&#xff08;SSA&#x…

CSS基础知识05(弹性盒子、布局详解,动画,3D转换,calc)

目录 0、弹性盒子、布局 0.1.弹性盒子的基本概念 0.2.弹性盒子的主轴和交叉轴 0.3.弹性盒子的属性 flex-direction row row-reverse column column-reverse flex-wrap nowrap wrap wrap-reverse flex-dirction和flex-wrap的组合简写模式 justify-content flex-s…

如何搭建一台邮箱服务器,配置满分邮箱

如何搭建一台邮箱服务器,配置满分邮箱 搭建一台个人邮箱服务器听上去非常有技术含量&#xff0c;但只要准备工作充分&#xff0c;并且选择合适的软件&#xff0c;配置满分的邮箱&#xff0c;其实并没有想象中那么困难。在这篇文章中&#xff0c;我们将介绍搭建邮箱服务器的 必备…

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力&#xff0c;覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中&#xff0c;项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化&#xff0c;不仅是技术层面的革新&#xff0c;更是团队协…

【JAVA毕业设计】基于Vue和SpringBoot的冬奥会科普平台

本文项目编号 T 610 &#xff0c;文末自助获取源码 \color{red}{T610&#xff0c;文末自助获取源码} T610&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询项目类型6.…

基于的图的异常检测算法OddBall

OddBall异常检测算法出自2010年的论文《OddBall: Spotting Anomalies in Weighted Graphs》&#xff0c;它是一个在加权图(weighted graph)上检测异常点的算法&#xff0c;基本思路为计算每一个点的一度邻域特征&#xff0c;然后在整个图上用这些特征拟合出一个函数&#xff0c…

网络工程师教程第6版(2024年最新版)

网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。 相关信息: 出版社: 清华大学出版社 ISBN:9787302669197 内容简介: 本书是工业和信息化部教育与考试中心组织编写的考试用书。本书 根据…

算法复杂度——大O表示法

参考视频&#xff1a;常见的大O表示法有哪些&#xff1f;时间复杂度是什么&#xff1f;_哔哩哔哩_bilibili

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一&#xff0c;Maven的概述 Maven的作用&#xff1a;专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提…

排序算法(基础)大全

一、排序算法的作用&#xff1a; 排序算法的主要作用是将一组数据按照特定的顺序进行排列&#xff0c;使得数据更加有序和有组织。 1. 查找效率&#xff1a;通过将数据进行排序&#xff0c;可以提高查找算法的效率。在有序的数据中&#xff0c;可以使用更加高效的查找算法&…

GraphLLM:基于图的框架,通过大型语言模型处理数据

GraphLLM是一个创新的框架&#xff0c;它允许用户通过一个或多个大型语言模型&#xff08;LLM&#xff09;来处理数据。这个框架不仅提供了一个强大的代理&#xff0c;能够执行网络搜索和运行Python代码&#xff0c;还提供了一套工具来抓取网页数据&#xff0c;并将其重新格式化…

TransFormer--解码器:概括

TransFormer--解码器&#xff1a;概括 假设我们想把英语句子I am good&#xff08;原句&#xff09;翻译成法语句子Je vais bien&#xff08;目标句&#xff09;。首先&#xff0c;将原句I am good送入编码器&#xff0c;使编码器 学习原句&#xff0c;并计算特征值。在前文中&…