【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.xdnf.cn/news/1474295.html

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

相关文章

dell Vostro 3690安装win11 23h2 方法

下载rufus-4.5.exe刻U盘去除限制 https://www.dell.com/support/home/zh-cn/product-support/product/vostro-3690-desktop/drivers dell官网下载驱动解压到U盘 https://dl.dell.com/FOLDER09572293M/2/Intel-Rapid-Storage-Technology-Driver_88DM9_WIN64_18.7.6.1010_A00_01…

【鸿蒙学习笔记】创建自定义组件

官方文档&#xff1a;创建自定义组件 目录标题 [Q&A] 如何自定义组件&#xff1f;&#xff11;・struct 自定义组件名 {...}&#xff12;・build()函数&#xff1a;&#xff13;・&#xff20;Component&#xff14;・Entry&#xff15;・Reusable 自定义组件的参数 buil…

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率&#xff0c;这个问题非常关键&#xff01; 以下为GD32F303系列MCU中有关ADC的参数&#xff0c;其中ADC时钟最大值为40MHz&#xff0c;12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话&#xff0c;可能会造成ADC采样异常&…

SAP_MM模块-采购信息记录变更文档的三种查询方式

最近有用户在问采购信息记录变更的信息怎么去查找&#xff0c;想要看看是谁更改了价格&#xff0c;于是就给她查了一下&#xff0c;顺便做个记录&#xff0c;SAP中的业务数据或者主数据的变更信息查询方法&#xff0c;都是比较类似的&#xff0c;学会了这三个方法&#xff0c;其…

商家店铺电商小程序模板源码

橙色通用的商家入驻&#xff0c;商户商家&#xff0c;商家店铺&#xff0c;购物商城&#xff0c;商家购物平台app小程序网页模板。包含&#xff1a;商家主页、优先商家、商品详情、购物车、结算订单、个人中心、优惠券、会员卡、地址管理等功能页面。 商家店铺电商小程序模板源…

SSM高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…

Centos新手问题——yum无法下载软件

起因&#xff1a;最近在学习centos7&#xff0c;在VM上成功安装后&#xff0c;用Secure进行远程登陆。然后准备下载一个C编译器&#xff0c;看网络上的教程&#xff0c;都是用yum来下载&#xff0c;于是我也输入了命令&#xff1a; yum -y install gcc* 本以为会自动下载&…

DevEco Studio无法识别本地模拟器设备的解决方法

目录 场景 解决办法 方式1 方式2 场景 有很多小伙伴遇到过安装了手机模拟器, 但是开发工具设备栏不识别手机设备的问题, 如下图,明明模拟器都安装了,并启动, 但为什么设备栏不显示呢? 解决后的截图,应该是这样(其实跟 android 类似 )

阶段三:项目开发---搭建项目前后端系统基础架构:任务11:搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 任务指导 1、讲框架的选择和原理 …

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二&#xff1a;简答题 三&#xff1a;综合题 一、选择…

『古籍自有答案』古风H5案例赏析

「古籍自有答案」&#xff0c;一部由新京报与字节跳动公益联合打造的古风H5&#xff0c;以诗意盎然的开篇引领用户穿梭于千年文脉。 part1. 创意定位 "人生有惑问先贤&#xff0c;先贤答案存古籍"&#xff0c;在这里&#xff0c;每一个灵魂的探问&#xff0c;都能在…

【电商系统开发实用接口指南】包含国内国外多电商平台商品数据对接(附文档)

关于电商数据接口 开发电商系统的朋友对于电商平台API肯定不陌生&#xff0c;API接口即应用程序编程接口&#xff0c;电商平台开放部分API接口&#xff0c;供商家和服务商调用&#xff0c;以满足电商业务管理需求。随着电商市场需求的日益增长以及技术手段的不断成熟&#xf…

推荐3款【王炸级别】的效率软件,免费无广告,你一定要收藏

Temp Cleaner Temp Cleaner 是一款专为 Windows 操作系统设计的临时文件清理工具。它的主要功能是安全且快速地清理磁盘上的临时文件和系统缓存&#xff0c;从而释放磁盘空间。该软件体积小巧&#xff08;仅有826KB&#xff09;&#xff0c;并且是无广告的绿色软件&#xff0c;…

77. UE5 RPG 创建角色的技能栏

在前面的文章里&#xff0c;我们实现了角色属性技能和场景。接下来&#xff0c;我们要优化角色显示UI&#xff0c;在屏幕底部显示角色血量&#xff0c;蓝量&#xff0c;技能和经验值。 创建新的用户控件 选择创建新的控件蓝图 父类为我们自定义的RPGUserWidget&#xff0c;这…

CIRKD

环境不好满足&#xff0c;不建议复现

【SOLID原则前端中的应用】里氏替换原则(Liskov Substitution Principle,LSP)- vue3示例

里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;规定&#xff0c;子类对象必须能够替换父类对象&#xff0c;并且程序的行为保持不变。 在Vue 3中&#xff0c;这意味着我们在创建可替换的组件时&#xff0c;应该确保子组件能够完全替代父组…

LeetCode 744, 49, 207

目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…

Vue3+.NET6前后端分离式管理后台实战(二十九)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十九)

Linux笔记之二

Linux笔记之二 一、文件属性学习二、软链接和硬链接1.软链接2.硬链接 三、Vim编辑器四、账号管理总结 一、文件属性学习 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同…

cf 7.7

Problem - C - Codeforces 大致意思&#xff1a; 找前缀&#xff0c;排序后使得本位之前数字和等于该位 &#xff08;以下代码超时了&#xff09; #include<bits/stdc.h> typedef long long ll;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) const ll …