《Linux下的进程创建》

news2025/3/2 4:23:42

【一】fork函数初识

  在Linux中fork函数是非常重要的,他从已存在的进程中创建一个新进程,进程为子进程,而原进程为父进程。

  返回值:fork函数的返回值是非常有意思的,他是有两个返回值的,对于父进程来说,返回值是子进程的id,对于子进程来说,返回值是0,但是如果子进程创建失败则返回-1.

  这个时候我们不难发现,为什么一个函数有两个返回值?因为子进程会完全继承父进程一切,也就相当父子进程中各含有一个fork函数,这个时候我们就不难发现,他们在两个进程中各返回一次,这样不就很简单的出现了两个返回值?

  当进程调用fork之后,当控制转移到内核中的fork代码后,内核做:

1.分配新的内存块和内核数据结构给子进程

2.将父进程部分数据结构拷贝至子进程

3.添加子进程到系统进程列表中

4.fork返回,开始调度器调度

见见猪跑:

 

 这里面就可以看出来,fork函数后面的代码执行了两次,父子进程各一次。

 图解就是这样的

所以在fork之后,父子两个执行流分别执行,注意,fork之后,谁先执行完全由调度器决定。

【二】写时拷贝

通常父子代码共享,父子不在写入时,数据也是共享的,当任意一方试图写入时,便以写时拷贝的方式各自一份副本,具体见下图:

fork()常规用法:
1.一个父进程希望复制自己,使父子进程同时执行不同的代码段,例如:父进程等待客户端请求,生成子进程来处理请求。

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

 fork()调用失败的原因:

系统中有太多的进程,实际用户的进程数超过了限制

【三】进程终止

进程退出的场景:

代码运行完毕,结果正确

代码运行完毕,结果不正确

代码异常终止

进程常见退出方法:

从main函数返回

调用exit

调用_exit

异常退出:ctrl+c 信号终止

exit和_exit的区别

exit最后也会调用_exit,但在调用exit之前,还做了其他的工作:

1.执行相关的清理函数

2.关闭所有打开的流,所有的缓存数据均被写入

3.调用_exit

 见见猪跑:

 结果:

 

结果:

 很简单的一个例子就是,_exit退出时不清空缓冲区的

RETURN退出

return是一种更常见的退出进程的方法,执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当作exit的参数

【四】进程等待

进程等待的必要性

1.之前说过,子进程退出,父进程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏。

2.另外,进程一旦变成僵尸状态,那就刀枪不入,水火不侵,杀人不眨眼的kill -9也无能为力,因为谁都没有办法杀死一个已经死去的进程。

3.最后父进程派给子进程的任务完成的如何,我们需要知道,如子进程运行完成,结果是对还是,或者是否正常退出。

4.父进程通过进程等待的方式去回收子进程资源,获取子进程的信息。

5.进程等待的方法:wait方法

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);

返回值:

成功返回被等待进程的pid,失败返回-1.

参数:

输出型参数,获取子进程退出状态,不管行可以设置成NULL

waitpid方法

pid_ t waitpid(pid_t pid, int *status, int options)

返回值:当正常返回的时候waitpid返回收集到的子进程ID;

如果设置了选项WNOHANG,而调用中waitpid发现没有已退出得子进程可收集,则返回0

如果调用中出错,则返回-1,这时error会被设置成相应得值以指示错误所在

参数:pid: Pid=-1,等待任一个子进程。与wait等效。 Pid>0.等待其进程ID与pid相等的子进程。 status: WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出) WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码) options: WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进 程的ID。

1.如果子进程已经退出,调用wait/waipid时,wait/waipid会立即返回,并且释放资源,获得子进程退出信息。

2.如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞

3.如果不存在该子进程,则出错返回

【五】获取子进程status

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。

如果传递NULL,表示不关心子进程的退出状态信息

否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程

status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特位)

 这玩意相当是一个位段,前面七比特位如果是0则表示正常终止,这个时候检查后面八个比特位,会记载他的退出状态,如果前面的七个比特位不是0的话,则表示是被信号所杀,前面记载终止信号。

这就是关于这期所有的进程的内容,如果有什么遗漏或者有问题的地方,还请移步于评论区交流,如果觉得写的还不错的话,还请一件三连,毕竟码字不易。

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

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

相关文章

QRegExp(正则表达式)

QRegExp 头文件&#xff1a;#include<QRegExp> 构造函数&#xff1a; 常用函数&#xff1a; indexIn()判断是否符合规则matchedLength()返回最后一个匹配字符串的长度&#xff0c;没有的话返回-1setPattern()将模式字符串设置为模式。区分大小写、通配符和最小匹配选项不…

openpnp软件的使用 - 引入坐标文件

文章目录openpnp软件的使用 - 引入坐标文件前言笔记生成符合openpnp要求的坐标文件板子在openpnp设备上摆放的规则确定openpnp设备的x,y方向确定自己板子的原点坐标和xy方向在openpnp设备平台上摆放板子在openpnp中引入坐标文件新建任务新建板子引入板子的坐标文件设置mark点Pa…

Starday影响者视频能给你提升80%的流量?

跨境电商行业随着互联网时代的推进&#xff0c;Starday跨境电商平台受到越来越多的人关注&#xff0c;许多商家受碍于疫情影响&#xff0c;为了个人商家和企业发展&#xff0c;将目光投于海外。如雨后春笋般出现的跨境电商平台&#xff0c;也为商家带来了许多困扰&#xff0c;该…

JS高级(一):类、原生tab栏切换、原型和原型链

JavaScript高级&#xff08;一&#xff09;一、类&#xff08;之前ES6学过&#xff09;1.类的用法2.类的继承2.1 extends关键字2.2 super关键字&#xff08;1&#xff09;子类属性和父类一致&#xff0c;constructor可以省略&#xff08;2&#xff09;子类要添加属性&#xff0…

axios 实现 POST/PUT接口入参是 query的形式而非JSON的形式——querystring的使用

先看下什么是query的形式入参&#xff1a; 1.常规的GET请求 一般是GET请求才会是query string parameters的形式入参 参数是query string parameters的展示&#xff0c;最终效果是拼接到url地址中&#xff0c;如下图所示&#xff1a; 2.常规的POST/PUT请求 一般是POST/PUT请…

云小课|使用SQL加密函数实现数据列的加解密

摘要&#xff1a;数据加密作为有效防止未授权访问和防护数据泄露的技术&#xff0c;在各种信息系统中广泛使用。作为信息系统的核心&#xff0c;GaussDB(DWS)数仓也提供数据加密功能&#xff0c;包括透明加密和使用SQL函数加密。本文分享自华为云社区《看GaussDB(DWS)如何使用S…

电感单位亨利H单位换算

1H 1e-18EH 1e-15PH 1e-12TH 1e-9GH 1e-6MH 0.001kH 1H 1,000mH 1,000,000uH 1,000,000,000nH 1,000,000,000,000pH 1,000,000,000,000,000fH 在线H亨利单位换算 (toolxq.com)http://www.toolxq.com/front/tools/trans/unit/H 亨利是电感的国际单位制导出单位&#xff0c;符…

2022年《微信小程序从基础到uni-app项目实战》

教程推荐&#xff1a;黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_ 一、起步 1 uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、And…

Word不计算封面、目录页数将正文页码修改为第几页共几页的格式

本文介绍在Word文档中&#xff0c;不考虑封面、目录、前言等的页数&#xff0c;为正文添加“第X页&#xff0c;共X页”样式页码的方法。 在Word中&#xff0c;我们可以双击页眉或页脚部分&#xff0c;选择“页码”选项并添加页码。 其中&#xff0c;可以添加如下图所示形式的页…

Nginx配置虚拟主机

虚拟主机指的是,在一台服务器中,我们使用Nginx,来配置多个网站。 如何区分不同的网站: 端口不同域名不同 1、通过端口区分不同的虚拟主机 1.1、Nginx配置文件 &#xff08;1&#xff09;Nginx配置文件的位置 cd /usr/local/nginx/conf nginx.conf 就是Nginx的配置文件 &a…

Docker学习

Docker学习 Docker概述 Docker安装 Docker命令 Docker镜像 Docker的数据卷 DockerFile Docker网络原理 IDEA整合Docker 集群-Docker Compose Docker Swarm CI\CD jenkins Docker概述 安装教程&#xff1a;(https://docs.docker.com/engine/install/centos/) 文档…

CSS初阶语法

CSS初阶语法 文章目录CSS初阶语法1.CSS介绍2.CSS引入方式3.CSS基础选择器3.1 标签选择器(标签名字)3.2 类选择器(class)3.3 id选择器(id)3.4 通配符选择器(*)4.文字基本样式4.1 字体样式(font-size、font-weight、font-style、font-family、font)4.2 文本样式(text-indent、tex…

SpringBoot SpringBoot 开发实用篇 2 配置高级 2.1 第三方bean 属性绑定

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇2 配置高级2.1 第三方bean 属性绑定2.1.1 ConfigurationProperties2.…

ERP系统有哪些品牌?

企业资源规划 (ERP) 系统可以帮助企业在一个系统中管理其整个运营。凭借 CRM、人力资源、会计、供应链管理等功能&#xff0c;优秀的 ERP 系统可以集中并简化每位员工的日常工作。 那么&#xff0c;ERP系统有哪些品牌&#xff1f;哪个好用&#xff1f;下面就来简单介绍几个主流…

Android Studio App开发之网络通信中移动数据格式JSON的讲解以及实战(附源码 超详细必看)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、移动数据格式JSON 网络通信的交互数据格式有两大类&#xff0c;分别是JSON和XML&#xff0c;前者短小精悍&#xff0c;后者表现力丰富&#xff0c;对于App来说&#xff0c;基本采用JSON格式与服务器通信。一是手机流量…

计算机网络的常见面试题

GET 和 POST 的区别 作用 GET用来获取资源&#xff0c;POST用于传输实体主体 参数位置 GET的参数放在URL中&#xff0c;POST的参数存储在实体主体中&#xff0c;并且GET方法提交的请求的URL中的数据多是2048字节&#xff0c;POST请求没有大小限制 安全性 GET方法因为参数放在…

二极管:Irush与我相干!

故事还没结束,我们必须继续讲,继续挖,边说边究。 即使时间us级不会让FUSE同学Open,FUSE后面的兄弟姐妹呢,可以扛住事吗?那可有3.4A的能量冲击啊! 不确定,就有可能。墨菲老人家曾说过:会出错的事总会出错。也就是会发生的事总会发生,只要不给时间加上一个期限,非要给…

外卖项目03---分类管理业务开发

目录 一、公共字段自动填充 41 1.1问题分析 41 ​编辑1.2公共字段自动填充---代码实现并测试 42 1.3公共字段自动填充---功能完善 43 二、新增分类 44 2.1需求分析 44 三、分类信息查询 45 3.1需求分析 45 3.2代码开发 流程分析 四、删除分类 46 4.1需求分析 46 4.2…

教你打造高性能的 Go 缓存库

我在看一些优秀的开源库的时候看到一个有意思的缓存库 fastcache&#xff0c;在它的介绍主要有以下几点特点&#xff1a; 读写数据要快&#xff0c;即使在并发下&#xff1b;即使在数 GB 的缓存中&#xff0c;也要保持很好的性能&#xff0c;以及尽可能减少 GC 次数&#xff1…

基于Fluent求解器进行二次开发到底怎么做?

作者 | 小田老师 Ansys Fluent软件作为通用的流体仿真软件&#xff0c;功能模型虽然多而全&#xff0c;但是缺乏相应的行业专业性。同时仿真分析具有一定的技术门槛&#xff0c;既需要技术人员具备行业基础&#xff0c;也需要积累相关仿真经验&#xff0c;对软件操作要有较高的…