【Linux】进程控制-进程终止

目录

一、进程终止,OS做了什么?

二、进程终止的常见方式

1、代码跑完,结果正确

2、代码跑完,结果不正确

补充

(1)、main函数的返回值的意义是什么?

(2)、return 0的含义是什么?

(3)、退出码是什么和sterror认识

(4)、如何获取退出码

3、代码没有跑完,程序崩溃

三、如何用代码终止一个进程

1、return语句

2、exit()函数

四、知识补充

1、return和exit()区别

2、exit()和_exit()区别

3、区别示意图

五、缓冲区相关知识

1、库函数和系统调用接口


一、进程终止,OS做了什么?

创建进程,不管是fork,命令行./或者双击都会变成进程,OS要管理这些进程要创建进程对应的内核数据结构task_struct,还要为该进程创建对应的地址空间mm_struct,还要为该进程创建页表,构建映射关系,并且还要将该进程对应的代码和数据加载到内存。

因此进程终止时,OS需要释放进程申请的相关内核数据结构和对应的数据和代码,本质就是释放系统资源。

二、进程终止的常见方式

1、代码跑完,结果正确

#include<stdio.h>
#include<unistd.h>26 int main()27 {28     printf("pid: %d,ppid: %d\n",getpid(),getppid());29     return 0;30 }   

2、代码跑完,结果不正确

  1 #include<stdio.h>2 #include<unistd.h>3 4 5 6 int sum(int top)7 {8     int s=0;9     for (int i=0;i<top;i++)                                                                                          10     {11         s+=i;12     }13     return s;14 }15 int main()16 {17     int ret=0;18     int res=sum(100);19     if(res!=5050)20     {21         //如果运行的代码不正确 return 122         ret=1;23     }24     return ret;25 }
[hx@VM-24-7-centos 20231203-进程终止]$ make
gcc -std=c99 -o myproc myproc.c
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
1

补充

(1)、main函数的返回值的意义是什么?

返回给上一级进程,父进程或者bash,用来评判该进程执行结果用的

(2)、return 0的含义是什么?

0是退出码的一种,代表运行成功,代码对或不对用退出码判定。

非0标识的是运行结果不正确,非0值有无数个,不同的非0值可以标识不同的错误原因,方便在进程运行结束后,结果不正确时,方便定位错误的原因。

(3)、退出码是什么和sterror认识

退出码是计算机为了方便返回结果设定的,我们并不清楚返回的1、2、3、4是什么意思,所以需要做一个将对应错误码或退出码转化为字符串描述的方案 .

strerror(number)将状态码或退出码转换成字符串描述。

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 //strerror(number)将状态码或退出码转换成字符串描述。5 int main()6 {7     for(int number=0;number<150;number++)8     {9         //查看number对应的错误原因                                                                                   10         printf("%d: %s\n",number,strerror(number));11     }12     return 0;13 }14 
[hx@VM-24-7-centos 20231203-进程终止]$ ls abcdef
ls: cannot access abcdef: No such file or directory
[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
2
[hx@VM-24-7-centos 20231203-进程终止]$ kill -9 11111
-bash: kill: (11111) - Operation not permitted
[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
1
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
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
14: Bad address
15: Block device required
16: Device or resource busy
17: File exists
18: Invalid cross-device link
19: No such device
.................................
129: Key was rejected by service
130: Owner died
131: State not recoverable
132: Operation not possible due to RF-kill
133: Memory page has hardware error
134: Unknown error 134
.....................
146: Unknown error 146
147: Unknown error 147
148: Unknown error 148
149: Unknown error 149
(4)、如何获取退出码

如果想在命令行中获取最近一次进程退出的退出码 通过

[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
0
[hx@VM-24-7-centos 20231203-进程终止]$ 

3、代码没有跑完,程序崩溃

当遇到程序崩溃的时候,例如遇到野指针,除0操作,退出码无意义。一般而言,退出码对应的return语句没有被执行。

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 5 //程序崩溃6 int main()7 {8     int *p=NULL;9     *p=1234;//野指针                                                                                                 10     return 0;11 }[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
Segmentation fault1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 5 //程序崩溃6 int main()7 {8     //int *p=NULL;9     //*p=1234;//野指针10 11 12     int a=10;
W> 13     a/=0;//除0操作                                                                                                 14     return 0;15 }[hx@VM-24-7-centos 20231203-进程终止]$ make
gcc -std=c99 -o myproc myproc.c
myproc.c: In function ‘main’:
myproc.c:13:6: warning: division by zero [-Wdiv-by-zero]a/=0;//除0操作^
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
Floating point exception

三、如何用代码终止一个进程

1、return语句

return语句就是用来终止进程的

main函数里执行 return语句是用来终止进程

其它函数内部执行return 语句代表函数返回。

2、exit()函数

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5 6 //exit()7 int main()8 {9     printf("hello world\n");10     printf("hello world\n");11     printf("hello world\n");12     exit(11);                                                                                                        13     printf("hello world\n");14     printf("hello world\n");15     printf("hello world\n");16     return 0;17 }[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
hello world
hello world
hello world
[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
11
[hx@VM-24-7-centos 20231203-进程终止]$

四、知识补充

1、return和exit()区别

return是一个语句:return在普通函数里通常代表函数调用结束,在main函数里代表进程退出

exit是一个函数:代表在任何地点终止进程

2、exit()和_exit()区别

1、exit是C语言提供的进程终止方案,进程终止时,会把缓冲区中的内容刷新到显示屏,然后再进行进程退出

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5 6 7 8 int main()9 {10     printf("you can see me?\n");11     sleep(3);12     exit(11);                                                                                                        13 }
//先打印结果 再sleep三秒
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
you can see me?
[hx@VM-24-7-centos 20231203-进程终止]$ 1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5 6 7 //exit()和_exit()对比8 int main()9 {10     printf("you can see me?");                                                                                       11     sleep(3);12     exit(11);13 }
//先sleep三秒 再打印结果
//去掉\n 因为数据没有\n所以数据没有立即刷新,说明这个数据当前一定在缓冲区里,最终程序退出时会刷新
//最终看到结果
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
you can see me?[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
11

2、_exit()是系统调用接口(系统层面上想终止进程,用的是_exit接口),直接终止进程,进程退出不会刷新缓冲区内的内容

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5                                                                                                                      6 //exit()和_exit()对比7 int main()8 {9     printf("you can see me?");10     sleep(3);11     _exit(11);12 }
//缓冲区里的内容并没有被刷新出来
//先sleep3秒,再进程退出
[hx@VM-24-7-centos 20231203-进程终止]$ ./myproc
[hx@VM-24-7-centos 20231203-进程终止]$ echo $?
11

3、区别示意图

exit()函数最后也会调用_exit()函数,但是再调用之前还做了其它工作:

1、执行用户定义的清理函数

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

3、调用_exit()函数

五、缓冲区相关知识

1、库函数和系统调用接口

os给我们提供接口是因为OS本身不相信我们,只是提供接口的方式交互,而我们对系统接口并不了解,就有人把系统接口做了封装,因此语言也就有了自己的库。

exit()底层调用的是_exit(),只不过直接调用_exit()数据没有立即刷新出来,而调用exit数据刷新出来了,那么缓冲区是谁在维护,在那一层维护呢?

这个缓冲区一定不在操作系统内部,如果是OS维护䣌,缓冲区的内容_exit()也能刷新出来,但是_exit()不能刷新缓冲区数据,而exit()可以,又因为exit()是C语言提供的函数,因此缓冲区应该由C语言提供的C标准库给我们维护的。

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

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

相关文章

基于OpenCV和改进深度学习网络的香菇分级图像分割系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来&#xff0c;随着计算机视觉和深度学习的快速发展&#xff0c;图像分割技术在各个领域中得到了广泛应用。图像分割是将图像划分为不同的区域或对象的过程&…

Visual Studio 2022+Python3.11实现C++调用python接口

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步。 查了一些资料&#xff0c;不是报这个错&#xff0c;就是报哪个错&#xff0c;没有找到和我安装的环境的一致的案例&#xff0c;于是将自己的摸索分…

SQL错题集1

1.找出选修课程成绩最差的选课记录 注&#xff1a; 聚合函数只能用在group by和&#xff08;&#xff09;括号中 找最值可用排序order bylimit 1 2. 查询选修成绩 合格的课程 超过2门的 学生编号 3.删除姓名为"LiMing"的学生信息 注&#xff1a; 删除一整行信息&…

CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程&#xff0c;分享如何将分布式理论应用于实际生产&#xff0c;以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…

java消息中间件简介

一、为什么要使用消息中间件 消息中间件就是可以省去繁琐的步骤&#xff0c;直达目的&#xff0c;怎么讲呢&#xff0c;就是比如你想很多人&#xff0c;知道你的动态&#xff0c;而知道的人可能手机没电&#xff0c;可能手机信号不好&#xff0c;可能手机不在服务区&#xff0c…

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Maven的安装与配置本地仓库,镜像源,环境变量详细步骤

参考视频&#xff1a; 黑马程序员2023新版JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程 【小飞非系列】最新Maven实战教程-项目实战构建利器 文章目录 一.下载Maven安装包二.配置Maven的本地仓库(本机仓库)三.配置镜像源&#xff08;加速jar包的下载)四.配置Maven的环…

Zookeeper 安装与部署

Zookeeper官网 目录 1 配置文件参数解读2 Zookeeper 单点安装3 Zookeeper 分布式安装 1 配置文件参数解读 Zookeeper 中的配置文件 zoo.cfg 中参数含义解读如下&#xff1a; &#xff08;1&#xff09;tickTime 2000&#xff1a;通信心跳数&#xff0c;Zookeeper 服务器与客户…

IdleStateHandler 心跳机制源码详解

优质博文&#xff1a;IT-BLOG-CN 一、心跳机制 Netty支持心跳机制&#xff0c;可以检测远程服务端是否存活或者活跃。心跳是在TCP长连接中&#xff0c;客户端和服务端定时向对方发送数据包通知对方自己还在线&#xff0c;保证连接的有效性的一种机制。在服务器和客户端之间一…

bean依赖属性配置

bean依赖属性配置 文章目录 bean依赖属性配置 Data ConfigurationProperties(prefix "cartoon") public class CartoonProperties {private Cat cat;private Mouse mouse; }cartoon:cat:name: whatage: 5mouse:name: howage: 6这样的话&#xff0c;业务bean无需在读…

FPC和PCB有哪些区别?

现在电子技术越来越先进&#xff0c;CPU可以做到5nm工艺&#xff0c;电路板可以做到几十层&#xff0c;可折叠屏应用多款手机中。 什么是FPC&#xff1f; FPC&#xff1a;Flexible Printed Circuit&#xff0c;柔性电路板&#xff0c;又被称为“软板” FPC 以聚酰亚胺或聚酯薄…

Active Stereo Without Pattern Projector论文精读

1.背景补充 主动立体相机和被动立体相机的主要区别在于它们获取立体视觉信息的方式 主动立体相机12&#xff1a; 主动立体视觉是指寻找最佳的视角去重建目标或者场景1。主动视觉的实现方式通常有&#xff1a;改变环境中的光照条件、改变相机的视角、移动相机自身位置等&…

利用 LD_PRELOAD劫持动态链接库,绕过 disable_function

目录 LD_PRELOAD 简介 程序的链接 动态链接库的搜索路径搜索的先后顺序&#xff1a; 利用LD_PRELOAD 简单的劫持 执行id命令 反弹shell 引申至 PHP 绕过disable_function 方法1&#xff1a;使用蚁剑的扩展工具绕过disable_function 方法2&#xff1a;利用 mail 函数…

电磁兼容EMC理论基础汇总

目录 0. 序言 1. EMC的基础介绍 1.1 EMC电磁兼容的定义 1.2 EMC的重要性 1.3 EMC的三要素 2. 库仑定律 3. 趋肤效应与趋肤深度 4. 电阻抗公式 4.1 电阻 4.2 容抗 4.3 感抗 4.4 电路元件的非理想性 5. 麦克斯韦方程组 5.1 高斯磁定律 5.2 高斯定律 5.3 法拉…

Appwidget开发基本介绍

本篇主要对appwidget开发进行简单介绍&#xff0c;为后续漏洞挖掘相关做前置铺垫 appwidget简介 官方解释如下&#xff1a; 应用微件是可以嵌入其他应用&#xff08;如主屏幕&#xff09;并接收定期更新的微型应用视图。这些视图称为界面中的微件&#xff0c;您可以使用应用微…

软件工程精品课程教学网站的设计与实现

系统功能需求分析 本系统要求采用Browser/Server模式设计开发&#xff0c;可以作为一般高等院校的网络学堂&#xff1b;可以为教师的辅助教学或者网络教学提供一个完善的教学网站&#xff1b;学生可以利用本教学网站来完成一些课程的学习任务。 2.2.1 功能划分 《软件工程》教学…

Sakila数据库和World数据库

Sakila数据库和World数据库 安装MySQL8.2的时候多出两个样例数据库 Sakila数据库和World数据库 Sakila数据库是一个关于DVD租赁的样例数据库&#xff0c;用于展示MySQL的各种功能和特性。Sakila数据库中包含了多个表&#xff0c;包括电影、演员、客户、租赁记录等&#xff0c;可…

Oracle(2-6) Backup and Recovery Overview

文章目录 一、基础知识1、Categories of Failures 故障类别2、Causes of Statement Failures 语句失败的原因故障情况Resolutions 决议 3、User Process Failures 用户进程失败故障情况Resolutions 决议 4、Possible User Errors 用户错误类型故障情况Resolutions 决议 5、Inst…

实验6 二叉树操作

0x01 实验目的 掌握二叉树的基本概念&#xff0c;二叉树的存储结构使用链表。 0x02 实验内容 输入一个完全二叉树的层次遍历字符串&#xff0c;创建这个二叉树&#xff0c;输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个…

计算UDP报文CRC校验的总结

概述 因公司项目需求&#xff0c;遇到需要发送带UDP/IP头数据包的功能&#xff0c;经过多次尝试顺利完成&#xff0c;博文记录以备忘。 环境信息 操作系统 ARM64平台的中标麒麟Kylin V10 工具 tcpdump、wireshark、vscode 原理 请查看大佬的博文 UDP伪包头定义&#x…