【linux进程控制(一)】进程终止--如何干掉一个进程?

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

进程终止

  • 1. 前言
  • 2. 文章整体结构脉络
  • 3. 从main函数return进程
  • 4. 使用库函数exit终止进程
  • 5. 系统调用_exit和exit的区别
  • 6. 进程异常终止的场景
  • 7. perror函数以及变量errno
  • 8. 总结

1. 前言

从这篇文章开始,将学习有关进程
控制的内容,包括:进程终止,进程等待
和进程的程序替换,内容不多,难度中等
请同学们耐心学习!

比起直接在界面输入CTRL+C
来终止一个进程外,我们更喜欢使用
一些函数接口(系统接口)来控制进程退出
一个进程的退出分为正常退出和异常退出

本章重点:

本篇文章着重讲解进程退出时
的三种场景以及常见的退出方法,
并且对比C库函数exit和系统调用
函数_exit的区别与联系.最后我们将
使用信号来模拟一些非正常退出的情况


2. 文章整体结构脉络

我们先把整篇文章的结构梳理出来

首先进程有三个退出场景:

  • 代码执行完,结果正确
  • 代码执行完,结果不正确
  • 代码异常终止了

第一,二种退出场景都是
属于正常退出的范围,正常退出
又有以下常见的方法:

  • 从main函数返回
  • 调用exit终止进程
  • 调用_exit终止进程

第三种退出场景是异常退出
异常退出往往是信号导致的,
我们熟悉的一个信号有:

  • CTRL+c,信号终止进程

全片文章将围绕以上内容做讲解!


3. 从main函数return进程

我们之前写C/C++代码时总会在写了
int main后写return 0,但是程序只能
return 0吗?答案是肯定不是!

先给出两个结论:

  1. 结论一:
  • 非main函数执行到return语句时
    代表此函数执行完毕!

  • main函数执行到return语句时
    代表此进程执行完毕!

  1. 结论二:
  • 程序正常执行完毕并且结果
    正确时返回0

  • 程序正常执行完毕但结果不正确
    时返回非0

有一个问题浮现在我们眼前,既然
结果不正确的返回值是非0,但是
非0有很多值,1,2,3,4,5等等,它们
分别有什么含义呢?不懂就去验证!

在验证前首先要明白一个函数:

在这里插入图片描述
它可以将错误码转换为错误字符串

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

在这里插入图片描述

不出所料,0对应成功!,

在这里插入图片描述

并且在134号错误以后,就是 未知错误了

查看最近进程的退出码:

使用指令: echo $?

写个代码,直接return来测试一下:

int main()
{return 66;
}

在这里插入图片描述


4. 使用库函数exit终止进程

在这里插入图片描述

exit的参数即为错误码,和main函数
的return值是一个意思

exit函数和return的区别:

  • return只有在main中使用时才
    代表此进程退出

  • exit函数在程序任一地方使用都
    可以直接退出程序,并且返回错误码

写一段代码验证一下:

void test1()
{exit(10);
}
void test2()
{exit(20);
}
int main()
{test1();exit(50);test2();return 0;
}

这里使用echo $?明显打印
出来的退出码是10!


5. 系统调用_exit和exit的区别

我们查看man的二号手册
可以看见_exit系统调用:

在这里插入图片描述

它和exit一样都是终止进程
并且_exit的参数也代表错误码
那么它们两个有什么区别呢?

我使用下面两段代码来验证:
一段用exit一段用_exit:

代码一:printf("你可以看见我吗?");sleep(1); //睡眠一秒exit(10);
代码二:printf("你可以看见我吗?");sleep(1); //睡眠一秒_exit(10);

下面两个图片对应运行结果:

在这里插入图片描述

直接看图片效果不是很好,这里建议
同学们自己去打一下这段代码

现象: 第一个打印了文字,而第二个没有打印

我们知道,printf打印的数据如果不使用
\n换行的话,数据会被存储到缓冲区里,
暂时不会打印出来,然而使用exit函数
结束进程后,缓冲区的数据被打印出来了
所以可以得出结论:exit函数会帮助我们
刷新缓冲区的数据,然而_exit函数不会

小思考:

既然exit是C语言提供的库函数
而_exit是操作系统提供的系统调用
_exit无法刷新缓冲区是不是说明缓冲区
压根就不在操作系统内?也就是说缓冲区
不由操作系统来维护,而是由C标准维护?

答案是,正确的!


6. 进程异常终止的场景

当我们在命令行输入CTRL+C传递
信号杀掉程序时,这是异常终止.
当程序中出现使用野指针或数组越界写入
时,程序会崩溃,崩溃也是进程异常结束

比如:

情况一:
int* p = NULL;
*p = 20;
情况二:
int a[10]={0};
a[11]=10;

此时运行程序后,程序会退出
这时候再去使用指令:echo $?
就没有意义了!

程序异常崩溃,退出码无意义
这是因为一般而言,退出码对应的
return语句还没执行到就已经崩溃了!


7. perror函数以及变量errno

errno是C语言中的一个全局变量

在这里插入图片描述

它里面存储的是最近的一个错误码
比如使用fopen函数打开文件时,
如果打开失败了,不仅仅文件指针fp
会被赋值为NULL,此时错误码errno
也会被系统自动赋值!

perror是C语言中常用的关于错误的函数

在这里插入图片描述

perror函数总是和errno搭配在一起
此函数会输出errno错误码对应的错误
信息,并且,perror的参数代表是哪个地方
有问题,是用户自己决定的!比如我们通常
这样来写一段代码:

FILE* fp = fopen("csdn.txt","r");
if(fp==NULL)
{perror("fopen");exit(1);
}

在这里插入图片描述

注意:打印出来的信息中,前面的fopen:
是用户输入的信息,后面的语句是errno
错误码对应的错误信息


8. 总结

进程终止话题是进程控制中最简单
的话题,学好进程终止可以提高我们
代码的可阅读性,可以把错误信息
展现的更加明了!

在本篇文章中出现的缓冲区概念只用于
区别exit和_exit的作用,更多关于缓冲区的
内容,我们将在Linux的基础IO中讲解!


🔎 下期预告:Linux进程等待 🔍

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

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

相关文章

【C++】C++11【上】列表初始化|声明|新容器|右值引用|完美转发|新的类功能

目录 1、 C11简介 2、 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list 3、声明 3.1 auto和范围for 3.1decltype 3.3 nullptr 4、新容器 5、 右值引用 5.1左值引用和右值引用 5.2 左值引用与右值引用比较 5.3 左值和右值引用使用场景及意义 6…

PC页面-企业微信扫码登录

vue代码引入企业微信扫码登录 企业微信后台管理配置。前端vue 代码使用的配置信息 项目需求PC端登录需要对接企业微信扫码登录功能。 根据同事研究成果&#xff0c;记录该功能的流程。 前端代码用的是vue。 企业微信后台管理配置。 企业微信后台管理登录连接 1、扫码登录企业…

【vscode远程开发】使用内网穿透实现在公网环境下远程访问

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

【年终特惠】基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

企业链表(未完成)

文章目录 1. 插入2. 类型转换说明2. 代码实现 1. 插入 // 插入 void insert(LinkList* list, int pos, LinkNode* data) {if (!list || !data)return;if (pos < 0 || pos > list->size)return;LinkNode* curNode &(list->head);for (int i 0; i < pos; i)…

【EI会议征稿】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;…

c++ | 字符串与指针的恩断情仇

我想&#xff0c;c/c中难的不是指针&#xff0c;而是其中的变化&#xff0c;尤其是思维的转变。很多东西 就是容易掉进陷阱。好在&#xff0c;你我都是善于思考的码农&#xff01; 大致情况是这样的&#xff0c;底层<–>c语言<–>c<–>应用 而数据的传输的最…

VCR库编写爬虫程序

VCR库编写一个爬虫程序来爬取图片&#xff0c;代码如下所示&#xff1a; require vcr require open-uri ​ # 使用VCR库录制一次HTTP请求 VCR.use_cassette(vip_crawler) do# 设置主机和端口proxy_host proxy_port # 创建一个HTT理对象proxy URI.parse("http://#{prox…

遥遥领先,免费开源的django4-vue3前后端分离项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V&#xff0c;电流高达500mA&#xff0c;而三个同步降压转换器的输入电压范围为3.0V至4.2V&#xff0c;输出电压范围为0.8V至3.9875V&#xff0c;峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

阿里云双11优惠活动:新老用户99元服务器和代金券领取攻略

2023阿里云双11优惠活动开启了&#xff0c;轻量2核2G3M带宽服务器87元一年、2核4G4M带宽165元一年&#xff0c;云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年&#xff0c;新老用户同享&#xff0c;并且续费不涨价&#xff0c;第二年99元续费。阿里云个人和企业用户还…

tcp/ip该来的还是得来

1. TCP/IP、Http、Socket的区别 \qquad 区别是&#xff1a;TCP/IP即传输控制/网络协议&#xff0c;也叫作网络通讯协议&#xff0c;它是在网络的使用中的最基本的通信协议。Http是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。Socket是对网络中不同主机上的应用进…

vue(32) : win10创建vue2基础前端框架

vue2element-uiaxios 1.创建vue2项目 开发工具为HBuilderX 3.7.3 1.1.新建项目 1.2.普通项目-vue项目(2.6.10) 等待创建项目 2.安装element-ui组件 2.1右键左下角开始图标 2.2.cd进入项目目录,执行安装element-ui npm i element-ui -S 2.3.main.js引入配置 import {Paginat…

vue3+ts 提取公共方法

因为好多页面都会使用到这个效验规则&#xff0c;封装一个校检规则&#xff0c;方便维护 封装前 封装后

C++ 面向对象 学习 优秀教程

油管看视频 沉浸式翻译插件&#xff0c;实现中文字幕&#xff01; 文章目录 Object Oriented Programming (OOP) in C Course Object Oriented Programming (OOP) in C Course https://www.youtube.com/watch?vwN0x9eZLix4 博主&#xff1a;https://www.youtube.com/CodeBeau…

vue指令

在 Vue&#xff0c;除了核心功能默认内置的指令 ( v-model 和 v-show )&#xff0c;Vue 也允许注册自定义指令。它的作用价值在于当开发人员在某些场景下需要对普通 DOM 元素进行操作。 Vue 自定义指令有全局注册和局部注册两种方式。先来看看注册全局指令的方式&#xff0c;通…

Centos8安装yum源时候出现的异常问题及解决方案(保好使)

问题的出现 作者在使用centos8的时候&#xff0c;想安装tree命令&#xff0c;输入了如下的命令&#xff1a; yum install tree 但是却显示了下面的错误&#xff1a; Errors during downloading metadata for repository base: - Curl error (28): Timeout was reached for h…

内涝积水监测仪怎么样?万宾科技城市内涝积水监测的作用

在城市建设发展过程中&#xff0c;道路基础设施的建设永远都占据着重要一席&#xff0c;因为人们出行一旦受阻便会影响城市进展&#xff0c;也会影响经济发展。在城市之中有隧道&#xff0c;下穿式立交桥等容易存积水的地方&#xff0c;一旦出现恶劣暴雨天气&#xff0c;这些地…

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前&#xff0c;ChatGPT、Llama 2、文心一言等主流大语言模型&#xff0c;因技术架构的问题上下文输入一直受到限制&#xff0c;即便是Claude 最多只支持10万token输入&#xff0c;这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题&#xff0c;加州伯克利…