Linux:进程控制(一)
目录
一、写时拷贝
1.创建子进程
2.写时拷贝
二、进程终止
1.函数返回值
2.错误码
3.异常退出
4.exit
5._exit
一、写时拷贝
父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷贝的方式各自有一份副本。
1.创建子进程
这是父进程的大致蓝图。
创建子进程,分配内存块和内核数据结构给子进程。
将父进程的部分数据结构内容拷贝到子进程,即代码内容共享,数据内容暂时共享。
2.写时拷贝
- 写实拷贝的大致蓝图
- 为什么要作写时拷贝?
子进程不一定会用到父进程的全部数据,故作写时拷贝用来完成特定的数据需求。
- 页表
页表并不是只有虚拟地址和物理地址两列,还有其他属性列,如“权限”、“是否存在于内存”。权限列有只读、可读可写等属性。
- 写时拷贝的具体过程
子进程复制父进程的部分内容后,操作系统在各自的页表中将数据段的属性设置为只读。
当发生写时拷贝时,由于页表项的属性是只读,故造成缺页中断,中断处理过程时,操作系统将页表项属性再设置为可读可写。
二、进程终止
1.函数返回值
main函数的返回值是当前进程的退出码,而普通函数的返回值仅仅是函数调用的结果。
main函数返回值为0,即退出码为0,表示当前程序运行成功,非零则表示失败,而失败的原因由错误码表示。
2.错误码
函数strerror用来打印错误码详情,Linux下错误码如下所示。
int main()
{for(int i = 0;i < 200 ;++i){printf("%d : %s\n",i, strerror(i));}return 0;
}
0 : Success
1 : Operation not permitted
2 : No such file or directory
3 : No such process
4 : Interrupted system call
5 : Input/output error
6 : No such device or address
7 : Argument list too long
8 : Exec format error
9 : Bad file descriptor
10 : No child processes
11 : Resource temporarily unavailable
12 : Cannot allocate memory
13 : Permission denied
······
错误码转换为错误描述,一般有两种情形,使用系统提供的或者自定义。
- 自定义错误码
enum
{success=0,open_err,malloc_err
};
const char* errornumToDisc(int code)
{switch(code){case success:return "Success!";case open_err:return "Open fail";case malloc_err:return "malloc error";default:return "unkonw errornum";}
}
int main()
{int code = open_err;printf("%d->%s\n",code,errornumToDisc(code));return code;
}
- 系统提供的错误码errno
当前程序退出后,默认errno保存着错误码。
如果程序正常退出,errno的值为0。
int main()
{printf("%d->%s\n",errno,strerror(errno));
}
可以通过echo $?查看最近一次运行的退出码。
[euto@VM-4-13-centos 241002]$ ./myprocess
0->Success
[euto@VM-4-13-centos 241002]$ echo $?
0
如果遇到错误退出,则可以通过errno打印错误信息。
int main()
{FILE* pf = fopen("a.txt","r");printf("%d->%s\n",errno,strerror(errno));return 0;
}
[euto@VM-4-13-centos 241002]$ ./myprocess
2->No such file or directory
3.异常退出
程序正常退出有三种方式。
- main函数的返回值
- 库函数exit
- 系统调用接口_exit
进程退出的场景只有三种:
1.正常退出:程序运行结束,运行成功,main函数返回0。
2.正常退出:程序运行结束,运行失败,main函数返回非零值。
3.异常退出:代码并没有被全部执行,一般异常退出是由于进程收到了异常信号,信号编码对应着发生异常的原因。
执行kill -l这些都是可以让进程异常退出的信号。
[euto@VM-4-13-centos 241002]$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
4.exit
EXIT(3) Linux Programmer's Manual EXIT(3)NAMEexit - cause normal process terminationSYNOPSIS#include <stdlib.h>void exit(int status);
exit函数是由C语言库提供,用来直接退出当前进程,参数的值即为退出码,如果运行成功,则执行exit(0)退出。
5._exit
_EXIT(2) Linux Programmer's Manual _EXIT(2)NAME_exit, _Exit - terminate the calling processSYNOPSIS#include <unistd.h>void _exit(int status);#include <stdlib.h>void _Exit(int status);
_exit是Linux系统调用接口,由Linux操作系统提供,总体上的用法和exit没有区别。差异在于exit函数在退出进程的时候会刷新缓冲区,而_exit函数则不会刷新缓冲区,不会刷新缓冲区也说明这个缓冲区不在操作系统内部。
分别执行下面两段代码,观察有何不同。
int main()
{printf("hello");exit(0);
}
int main()
{printf("hello");_exit(0);
}
总结,推荐使用exit,原因不是因为它会刷新缓冲区,而是因为它是由C语言库提供,内部其实封装了_exit,进程的结束肯定是由操作系统调用系统调用接口来结束,exit只是封装Linux系统调用接口_eixt罢了,同时也封装了Windows平台的系统调用接口,这样一来,使用exit的程序具备可移植性,在Linux平台调用Linux平台的系统调用接口_exit,在Windows平台调用Windows平台的系统调用接口。
相关文章:
Linux:进程控制(一)
目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…...
初识算法 · 双指针(3)
目录 前言: 和为s的两数之和 题目解析: 编辑 算法原理: 算法编写: 三数之和 题目解析 算法原理 算法编写 前言: 本文通过介绍和为S的两数之和,以及三数之和,对双指针算法进行深一步…...
【AI知识点】近似最近邻搜索(ANN, Approximate Nearest Neighbor Search)
近似最近邻搜索(ANN, Approximate Nearest Neighbor Search) 是一种用于高维数据检索的技术,目标是在给定查询的情况下,快速找到距离查询点最近的数据点,尽管结果可能并不完全精确。这种方法特别适用于高维数据&#x…...
编程工具简介
在编程工作中,选择合适的工具确实能够显著提升工作效率。以下是一些被广泛推荐的工具: 1. Visual Studio Code (VS Code):这是一款轻量级但功能强大的代码编辑器,支持多种编程语言,拥有丰富的插件生态系统࿰…...
汽车信息安全 -- 存到HSM中的密钥还需包裹吗?
目录 1.车规芯片的ROM_KEY 2.密钥加密与包裹 3.瑞萨RZ\T2M的密钥导入 4.小结 在车控类ECU中,我们通常把主控芯片MCU中的HSM以及HSM固件统一看做整个系统安全架构的信任根。 所以大家默认在HSM内部存储的数据等都是可信的,例如CycurHSM方案中使用HSM…...
【PostgreSQL】入门篇——SELECT、INSERT、UPDATE 和 DELETE 语句,SQL 中最常用的四种操作用法
1. SELECT 语句 描述 SELECT 语句用于从数据库中查询数据。可以选择特定的列或所有列,并可以通过条件过滤结果。 语法 SELECT column1, column2, ... FROM table_name WHERE condition;示例 假设我们有一个名为 employees 的表,结构如下:…...
【Ubuntu】安装常用软件包-mysql
我的几个服务是部署在docker的同一个网络里,这样相互访问就可以通过docker容器的名字访问,比如容器A访问容器B,就可以http://B:8080/xxx 这样访问,不用关心ip是多少。 所以mysql前面文章给安装到主机里,感觉有点坑自己…...
幂等性及技术解决方案
文章目录 定义幂等性 为什么需要幂等性幂等性设计注意事项幂等性的范围分布式锁解决幂等性 设计 延伸阅读 定义幂等性 简单地说,我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次,则不具有额外效果的操作,也就是多…...
正向代理 反向代理
正向代理 正向代理是一种网络服务,它作为客户端和目标服务器之间的中间人,代表客户端向目标服务器发送请求并接收响应。以下是关于正向代理的详细解释: 工作原理 客户端配置: 客户端(如浏览器)配置为使用…...
【分布式微服务云原生】如何在ActiveMQ中优雅处理提前支付的延时订单
摘要 本文将深入探讨在ActiveMQ中如何处理用户提前支付的延时订单问题。我们将介绍如何通过更新订单状态、检查延迟任务、取消延迟消息、使用死信队列、消息选择性消费、设置合理的超时时间以及及时反馈和日志记录等策略,来确保系统的一致性和及时响应用户操作。文…...
Easy Excel从入门到精通!!!
目录 1.文件导入 1.1基本方式读取excel文件内容 1.2注解模型映射器读取excel 1.3多行表头读取 1.4文件上传读取 2.文件导出 2.1基本方式导出 2.2模型映射导出 2.3设置行高、列宽等内容 2.4合并单元格 2.5导出设置超链接、批注、公式 2.6模板填充对象导出 2.7模板填…...
简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值
在开篇,还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&…...
【算法】---归并排序(递归非递归实现)
参考 左程云算法 算法导论 前言 本篇介绍 归并排序分治法 前置知识 了解递归, 了解数组。 引入 归并排序 归并排序最早是由公认的现代计算机之父John von Neumann发明的, 这是一种典型的分治思想应用。 我们先介绍分治思想 分治思想 分治思想的…...
UniVue大版本更新:UniVue2.0.0-preview
大版本发布说明 距离上次更新好像已经过去很久了,最近太忙了没时间维护新版本,也是自己在使用的过程中发现了很多问题也有了更多的灵感,由于和之前的版本区别太大,决定重新开一个大版本。这个UniVue2之后的版本追求是性能…...
RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)
目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…...
C++基础补充(02)C++其他控制语句break continue goto等
文章目录 1. break2. continue 语句3. goto 语句goto的存在 4. 跳出多重循环4.1 goto 直接跳转4.2 C11及其后版本的 return 语句4.3 使用标志变量 在C中,控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…...
决策树中联合概率分布公式解释说明
学习决策树时书本中有一公式 7-3 是: P ( X x i , Y y j ) p i j ( i 1 , 2 , … , m , j 1 , 2 , … , n ) P(X x_i, Y y_j) p_{ij} \quad (i 1, 2, \dots, m, \ j 1, 2, \dots, n) P(Xxi,Yyj)pij(i1,2,…,m, j1,2,…,n) 这个公式表示的是随机变…...
计算机毕业设计 农场投入品运营管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
php email功能实现:详细步骤与配置技巧?
php email发送功能详细教程?如何使用php email服务? 无论是用户注册、密码重置,还是订单确认,电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能,并提供一些配置技巧,帮助你更好…...
MapBox Android版开发 6 关于Logo
MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路(Logo)第一步第二步 隐藏Logo示例查看源码及思路(Info)第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo,今天看了下V9源码,发现M…...
2024年房市
24年8月15日,国家统计局公布,“7月末,商品房待售面积73926万平方米”。(原文链接:https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html) 7.39亿平方存量商品房,估价均价1万每平,总价约&am…...
index索引
index索引: create index 【1】on 【2】(【3】) 1为索引名,通常为id_表名_列名。2为表名。3为列名。 CREATE INDEX id_account_id ON account(id); -- 根据id创建索引 CREATE INDEX id_account_idname on account(id,name); -- 创建组合索引 索…...
理解互联网链路:从本地ISP到Tier 1 ISP运营商
1. 互联网服务提供商(ISP) 互联网服务提供商(ISP)是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网,并提供相关的服务,如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...
基于元神操作系统实现NTFS文件操作(三)
1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...
深度学习与数学归纳法
最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …...
《Linux从小白到高手》理论篇(六):Linux软件安装一篇通
List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…...
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...
②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 (接上一章) 自由协议通信步骤 (以MS-A2-1041为例) 接收与…...
matlab-对比两张图片的HSV分量的差值并形成直方图
%对比两张图片的HSV分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…...
微服务SpringGateway解析部署使用全流程
官网地址: Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用: 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...
外贸独立站运营/百度指数查询平台
《机器学习实战》第三章 3.2 在Python中使用Matplotlib注解绘制树形图 自己按照树上的代码敲了一遍(Spyder),调试之后可以使用,向大家分享一下,另外,有好多的注解,希望对大家有帮助。 代码源代…...
无锡企业如何建网站/互联网舆情
用最大似然估计或者map导出能量模型 参考 最大似然估计 假设有个服从未知分布的随机变量,类似黑盒子,它产生了很多能看得见的样本。那这时候,我们可以通过最大化看到这些样本的概率来反推出模型最优的参数,这种方法叫做最大似然…...
百度wap网站建设/百度pc端网页版
一、过拟合及欠拟合 1、过拟合:一个假设在训练集数据上能够比其他假设更好的拟合,但是在训练集外的数据集上却不能很好的拟合数据,此时认为这个假设出现了过拟合现象。(模型过于复杂) 过拟合原因:原始特征…...
商城建设网站公司/seo网站推广软件
雷锋网按:本文作者 Carlos E. Perez ,他来自机器学习技术公司 Intuition Machine,主要研究深度学习类型、方法论、以及行业战略。 发布于 Medium 的这篇文章主要对 2017 年深度学习的十大趋势做出了预测,雷锋网(公众号:…...
购物网站 功能/缅甸最新新闻
6种.net分布式缓存解决方式1. 使用内置ASP.NET Cache (System.Web.Caching) : https://msdn.microsoft.com/en-us/library/system.web.caching(vvs.110).aspx2. 使用System.Runtime.Caching: https://msdn.microsoft.com/en-us/library/system.runtime.caching(VS.100)…...
搭建网站免费/seo网站优化方案
Html页面j基于vue.js引入elementUI控件你好! 这是我第一次在html页面里引入 Vue.js 。如果你想学习了解, 可以仔细阅读这篇文章,了解一下vue.js的基本语法知识。引入vue,jsvue相信大家都不陌生,他是前端最主流框架之一,也是目前市…...