【Linux】:进程创建与终止

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

​ 

目录

1. 进程创建

1.1 fork返回值

1.2 fork调用失败的原因

2. 进程终止 

2.1 进程退出的场景

2.2 退出码

2.3 进程常见的退出方式 

2.4 退出码和错误码

2.5 进程异常


1. 进程创建

 进程创建在之前的进程创建与fork本质这一章节已经详细介绍过,这里就简单回顾一下。

创建进程我们通常使用fork函数,在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

#include <unistd.h>
pid_t fork(void);
// 返回值:子进程中返回0,父进程返回子进程id,出错返回-1
进程调用fork,当控制转移到内核中的fork代码后,内核做:
  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。

1.1 fork返回值

  • 子进程返回0
  • 父进程返回子进程的pid

1.2 fork调用失败的原因

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

2. 进程终止 

2.1 进程退出的场景

每一个进程退出场景无非就这三种情况:

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

在多进程环境中,我们创建子进程的目的就是为了让子进程帮助我们完成一些任务,那么我们怎么知道子进程把任务完成的怎么样呢?所以就需要知道子进程在退出时带给我们的反馈信息--退出码 

2.2 退出码

退出码表示的是我们运行完毕,结果是否正确合理。

Linux查看退出码:echo $? 

main函数也是个函数,我们一直都在写的main函数中的return 0表示的是什么意思呢?

main函数的返回值,就叫做进程的退出码。

退出码为0表示进程运行成功;

退出码为非0表示进程是因为什么原因失败的。

通过上面的图片可以发现,为什么我们第一次查看退出码是10,表示main函数的退出码,但是为什么第二次再查就变成了0呢?

echo $?:保存的是最近一个子进程执行完毕时的退出码。

我们在命令行输入的指令也是一个程序,先运行我们自己写的main函数,查看的时候就是main函数的返回值10,再次查看的时候,最近一次运行的进程就变成了我们上一次查看退出码的指令,这个指令运行成功了,所以第二个才看到0。

2.3 进程常见的退出方式 

正常终止

1. 通过main函数的返回;

2. 调用exit / _exit函数;

exit函数

#include <unistd.h>
void exit(int status);  // status退出码

_exit函数

#include <unistd.h>
void _exit(int status);

细节问题:

1. 其它函数中进行return,表示的是函数调用结束。

2. 任意地点调用exit/_exit,表示进程结束,不会执行后续代码。

exit与_exit区别

1. exit()是库函数,_exit()是系统调用。

2. exit()终止进程时会刷新缓冲区,_exit()终止进程时不会刷新缓冲区。

退出码都是数字,不便于我们查看,所以也提供了转化为字符串形式的退出码。

在C语言中有一个函数可以打印错误信息:strerror

接下来我们就将系统默认的退出码打印出来看看分别都对应哪些信息:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main()
{
    for (int i = 0; i < 200; i++)
    {
        printf("%d: %s\n", i, strerror(i));
    }
    return 0;
}

 

在0~200之间系统默认的只有0~133表示退出信息。

使用退出码时我们不仅可以使用系统默认的,也是可以自定义的。

我们需要知道的是:main函数的退出码可以被父进程获取,用来判断子进程的运行结果的! 

2.4 退出码和错误码

错误码是C语言中一个变量errno,当我们调用库函数失败时,错误码就会被设置。

退出码:一个进程退出时,它的退出结果。

错误码:衡量一个库函数或是一个系统调用的调用情况。

2.5 进程异常

当一个进程异常终止了,此时的退出码已经不重要,我们需要知道的是它因何种原因异常终止。

就比如语言级别的除0错误、对空指针的解引用以及越界访问。

当我们有这样的程序运行起来之后,就会变成OS内的一个进程,此时OS检测到了进程出现异常,那么就会给该进程发送指定的信号来终止进程。

当我们程序运行起来之后,我们也可以给它发送信号让它异常终止:

所以,一个进程是否异常,看我们是否收到信号,一个进程运行结果如何,通过退出码判断。他们两个都是数字,父进程可以接收到这两个数字,然后判断程序的合理性即可。 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!     

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 优秀本科毕业论文系统是一套完善的web设计系统&#xff0c;对理解JSP java serlvet 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

【深度学习】图形模型基础(5):线性回归模型第三部分:线性回归模型拟合

1.引言 本博文专辑的焦点主要集中在回归模型的实用案例和工具上&#xff0c;从简单的单变量线性回归入手&#xff0c;逐步过渡到包含多个预测变量、非线性模型&#xff0c;以及在预测和因果推断中的应用。本文我们将介绍回归模型推断的一些数学结构&#xff0c;并提供一些代数…

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强&#xff08;Offline Augmentation&#xff09; 2.2.2 在线增强&#xff08;Online Augmentation&#xff09; 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…

A股继续3000以下震荡,而国外股市屡创新高,人民币反弹能带动A股吗?

今天的A股&#xff0c;让人愤愤不已&#xff0c;你知道是为什么吗&#xff1f;盘面上出现3个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市一度回踩2920点&#xff0c;让股民的心都开始悬起来了。而午后市场行情有了转变&#xff0c;下跌的股票开始明显变…

go 为什么是抢占式调度

GMP 模型 gmp模型是 golang 中用于调度管理 goroutine 的调度器。 调度器的发展史 在 Go 语言中&#xff0c;Goroutine 早期是没有设计成抢占式的&#xff0c;早期 Goroutine 只有读写、主动让出、锁等操作时才会触发调度切换。 这样有一个严重的问题&#xff0c;就是垃圾回…

【Mac】adobe CameraRaw 16 for mac(ps插件RAW处理工具)软件介绍

软件介绍 Adobe Camera Raw是一款专为处理和编辑数字照片原始文件&#xff08;RAW文件&#xff09;而设计的插件&#xff0c;它提供了丰富的功能来调整和优化图像。以下是它的主要特点和功能&#xff1a; 支持广泛的RAW格式&#xff1a; Adobe Camera Raw 16 支持处理来自各…

【深度学习】第3章实验——回归模型

根据相关数据集进行回归分析 1. import statsmodels.api as sm # df.loc[:, ...] 表示选择所有行。 # df.columns ! mpg 创建一个布尔数组&#xff0c;指示哪些列不等于 mpg。 # df.loc[:, df.columns ! mpg] 选择 df 中所有行和列名不等于 mpg 的所有列。 x df.loc[:,df.col…

在 Azure 云中开始使用适用于 Ubuntu 的 Grafana

介绍 Grafana 是一款开源工具&#xff0c;可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时&#xff0c;您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…

ESD管ESD113-B1-02EL(S)国产替代型号ULC0342CDNH,ULC0321CDNH

雷卯型号全&#xff0c;能替代大量infineon型号。具体如下&#xff1a; 应用于3.3V高速信号静电保护器件&#xff0c;infineon的ESD113-B1-02EL(DFN1006)和ESD113-B1-02ELS(DFN0603)&#xff0c;交期长&#xff0c;价格高。已经有很多客户选雷卯的 ULC0342CDNH(DFN1006)&#…

Linux 【线程池】【单例模式】【读者写者问题】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 &#x1f3f3;️‍&#x1f308;前言 …

项目一 nfs 共享服务器 Haproxy 代理 Keepalive 高可用集群

深入理解程序的数据存储 配置NFS服务器 配置ansible环境

云联壹云 FinOps:赋能某车企公有云成本管理与精细化运营

背景 某车企&#xff0c;世界 500 强企业&#xff0c;使用了大量的公有云资源&#xff0c;分布于多家公有云&#xff0c;月消费在千万级别。 业务线多且分散&#xff0c;相关的云消耗由一个核心团队进行管理&#xff0c;本次案例的内容将围绕这些云成本的管理展开的。 需求 …

香蕉云编+uniapp打包ios的开发包和生产包

登录香蕉云编&#xff0c;找到 云编-ios证书生成&#xff0c;新建CSR文件&#xff0c;并下载csr文件。 登录苹果开发者中心&#xff0c;进入证书页面。 1.创建一个证书&#xff0c;选择ios Distribution类型即可&#xff0c;这是个通用的证书&#xff0c;既能用来打正式包又能…

Appium元素定位(全网详细讲解)(二)

1.appium inspector&#xff08;定位元素的工具&#xff09;使用方法 详细介绍&#xff1a; 详细解释&#xff1a; 图标名称说明1Show Element Handles是否显示元素句柄2Select Elements选择元素定位3Tap/Swipe By Coordinates按坐标点击/滑动4Download Screenshot下载屏幕截…

日期选取限制日期范围antdesign vue

限制选取的日期范围 效果图 <a-date-pickerv-model"dateTime"format"YYYY-MM-DD":disabled-date"disabledDate"valueFormat"YYYY-MM-DD"placeholder"请选择日期"allowClear />methods:{//回放日期选取范围限制&…

Type-C接口快充取电技术的实现

Type-C接口快充取电技术的实现 Type-C接口快充取电技术主要通过USB PD&#xff08;Power Delivery&#xff09;协议实现。这种技术利用了Type-C接口的物理特性和PD协议的智能性&#xff0c;实现了高效、安全、快速的充电过程。具体实现过程如下&#xff1a; 接口连接与检测&a…

maven项目使用netty,前端是vue2,实现通讯

引入的java包 <!-- 以下是即时通讯--><!-- Netty core modules --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.76.Final</version> <!-- 使用最新的稳定版本…

模型驱动开发(Model-Driven Development,MDD):提高软件开发效率与一致性的利器

目录 前言1. 模型驱动开发的原理1.1 什么是模型驱动开发1.2 MDD的核心思想 2. 模型驱动开发的优势2.1 提高开发效率2.2 确保代码一致性2.3 促进沟通和协作2.4 方便维护和扩展 3. 实现模型驱动开发的方法3.1 选择合适的建模工具3.1.1 UML3.1.2 BPMN3.1.3 SysML 3.2 建模方法3.2.…

解决使用PPIO欧派云服务器时无法使用sftp的问题

首先在对外TCP端口中选择22端口&#xff1a; 在连接-端口映射中可以看到&#xff1a; 使用ssh连接云服务器&#xff0c;更新包列表并安装OpenSSH服务器&#xff1a; apt-get update apt-get install-y openssh-server 创建 SSH 运行目录&#xff1a; mkdir /var/run/sshd 设…