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

news2025/1/23 2:11:08

目录

一、进程终止,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 1
 22         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 fault

   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 
   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.coloradmin.cn/o/1289957.html

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

相关文章

ps-把文字刻进石头上

使用到的工具 准备图片&#xff1a;一张石头的图片&#xff0c;一张有喜欢字体的空白图片 得到一个纹理的psd文件&#xff1a;只把文字的图片显示&#xff0c;CTRLshifts保存成psd文件 “滤镜”——“滤镜库”——“纹理化”——&#xff08;选中文字图片的psd文件&#xff09…

代码随想录算法训练营第三十六天|01背包问题 二维 ,01背包问题 一维 ,416. 分割等和子集

背包理论基础 01 背包&#xff08;二维&#xff09; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 背包最大重量为4。 物品为&#x…

Segment Anything--SAM自动标注(一)

文章目录 开场白基本组件搞事情从来不是一帆风顺复旦方案分支回归主线 开场白 老样子先说一下为什么我会看到这篇文章。答案是“自动标注”。 这个事情是这样&#xff0c;自动驾驶不光需要做目标检测任务也需要语义分割的信息给到后处理。当然现在做自动驾驶都在往BEV方案上靠…

IntelliJ IDEA 之初体验

文章目录 第一步&#xff1a;下载与安装 IntelliJ IDEA1&#xff09;官网下载2&#xff09;选择那种安装包3&#xff09;开始下载4&#xff09;解压 第二步&#xff1a;启动 IntelliJ IDEA第三步&#xff1a;创建第一个 Java 项目第四步&#xff1a;运行第一个 Java 程序1&…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述&#xff0c;考查时易针对有关概念或性能指标出选择题&#xff0c;也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念&#xff0c;是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

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

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

十五、FreeRTOS之FreeRTOS信号量

本节需要掌握以下内容&#xff1a; 1&#xff0c;信号量的简介&#xff08;了解&#xff09; 2&#xff0c;二值信号量&#xff08;熟悉&#xff09; 3&#xff0c;二值信号量实验&#xff08;掌握&#xff09; 4&#xff0c;计数型信号量&#xff08;熟悉&#xff09; 5&…

Linux--程序地址空间

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局…

Transformer在视觉的应用

文章目录 Vison TransformerSwin TransformerVisual Attention Network Vison Transformer transformer 在 cv 中最重要的算法 Linear Projection of Flattened Patches 对于标准的Transformer模块&#xff0c;要求输入的是token&#xff08;向量&#xff09;序列&#xff…

鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期与页面中组件的生命周期(十六)

文章目录 一、应用生命周期二、生命周期函数定义三、生命周期五函数练习 一、应用生命周期 1、定义 应用生命周期就是代表了一个HarmonyOS应用中所有页面从创建、开启到销毁等过程的全生命周期。查看路径如下&#xff1a; Project/entry/src/main/ets/entryability/EntryAbili…

vue elementUI 上传非空验证

<el-form-item label"照片" prop"staffImg"><template v-slot:label><span v-show"!rules.staffImg[0].required"style"color: #ff4949;margin-right: 4px;">*</span><span>照片</span></temp…

【JavaWeb学习笔记】6 - Tomcat

项目代码 零、在线文档 Apache Tomcat 8 (8.0.53) - Documentation Index WEB开发 1. WEB,在英语中web表示网/网络资源(页面&#xff0c;图片,css,js)意思&#xff0c;它用于表示WEB服务器(主机)供浏览器访问的资源 2. WEB服务器(主机)上供外界访问的Web资源分为: 静态web…

LeetCode 每日一题 Day 4

2477. 到达首都的最少油耗 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads &#xff0c;其中 roads[i] [ai,…

Myblog01-基于基本的javaWeb设计实现

目录 一、项目概述&#xff1a; 应用技术&#xff1a; 接口实现&#xff1a; 数据库建表&#xff0c;sql脚本&#xff1a; 页面展示&#xff1a;登陆页面 项目源码&#xff1a;myblog01: 初版的个人博客项目-使用基本的javaWeb (gitee.com) 二、对博客系统进行测试 总结 一、项…

怎么给文章润色?文章润色怎么收费?

文章润色&#xff0c;指的是在原有文章基础上&#xff0c;对语言表达、逻辑结构、风格等方面进行优化调整&#xff0c;以提高文章的阅读体验和质量。 润色不同于修改&#xff0c;修改主要针对文章中的错误&#xff0c;如语法、拼写、标点等&#xff1b;而润色则是对文章的整体…

网页抓取为什么要使用http代理?

目录 前言 一、网页抓取的定义 二、使用HTTP代理的原因 1. 防止IP被封锁 2. 提高访问速度 3. 保护隐私 4. 突破地域限制 三、使用Python进行网页抓取并使用HTTP代理 1. 安装必要的Python模块 3. 获取网页源代码 4. 解析网页内容 总结 前言 网页抓取是指从互联网中…

如何解决syntaxerror: more than 255 arguments 报错

如何解决syntaxerror: more than 255 arguments 报错 问题背景解释解决方案 问题背景 今天拼接特征的时候&#xff0c;突然代码报错syntaxerror: more than 255 arguments &#xff0c;看了一下感觉这个报错非常有意思&#xff0c;估计平时也是没机会碰到&#xff0c;和大家分…

课题学习(十五)----阅读《测斜仪旋转姿态测量信号处理方法》论文

一、 论文内容 1.1 摘要 为准确测量旋转钻井时的钻具姿态&#xff0c;提出了一种新的信号处理方法。测斜仪旋转时&#xff0c;垂直于其旋转轴方向加速度计的输出信号中重力加速度信号分量具有周期性特征&#xff0c;以及非周期性离心加速度分量频率低于重力加速度信号分量频率…

ROS-ROS通信机制-参数服务器

文章目录 一、基础理论知识二、C实现三、Python实现 一、基础理论知识 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点…