[linux]进程控制——进程终止

一、main函数的返回值

我们在编写C语言的程序时,通常会这样写:

int main()
{return 0;
}

那么我们为什么要返回(return)0 呢?

其实,main函数也是一个函数,它也会被调用,所以谁调用main函数,这个返回值就会返回给谁。

我们写一个test.c来观察:

#include<stdio.h>int main()
{//codereturn 3;
}

执行以上程序,我们可以看到return返回值写的是3。

我们可以通过 echo $? 查看进程退出码:

  • main函数的 返回值,就叫做进程的退出码。
  • 0 -> sucess (0表示成功)
  • !0 -> failed   (!0表示失败);此时我们就可以用不同的数字表示不同的原因                                                                                                                            

main函数的退出码是可以被父进程获取的,用来判断子进程的运行结果。 

 注:

纯数字虽然能表明出原因,但是不便于人类的阅读,所以我们将 exit code -> exit code string(可以用内置的,也可以自定义)

例:打印Linux中的错误码信息(根据运行结果可以看出有133个) 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{//codeint i = 0;for(i = 0; i < 200; i++){printf("%d: %s\n", i, strerror(i));}return 3;
}

我们运行的mybin文件就是bash的子进程。子进程退出时,退出码会被它的父进程自动获得。

echo $? 中,?中保存的是最近一个子进程执行完毕时的退出码。 

 

例:

错误码是127 

错误码是1 

错误码与退出码

  • 错误码通常是衡量一个库函数或者是一个系统调用、一个函数的调用情况
  • 退出码通常是一个进程退出的时候,它的退出结果

相同的是,当失败的时候,用来衡量函数、进程出错时的出错详细原因。

二、进程终止

1、进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

异常:

进程出现异常,本质是进程收到了对应的信号,自己终止了。

例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{char* p = NULL;*p = 1;return 0;}

运行后: 

 

出现异常后,操作系统会根据发送的信号将该进程杀死。

Linux中:

那么,我们可以通过发送信号来终止一个进程 :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main()
{while(1){printf("进程: %d\n", getpid());sleep(1);}return 0;
}

程序运行:

此时,我们可以通过kill -11 27747 杀死该进程 (以 -11 为例,也可以是其它信号):

 

 因此,一个进程是否出异常,我们只需看有没有收到信号即可。

 2、exit(进程的退出码)

任意地点调用exit,都表示进程直接退出,不进行后续执行。

exit: 

1. 执行用户通过 atexit或on_exit定义的清理函数。
2. 关闭所有打开的流,所有的缓存数据均被写入
3. 调用_exit

例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main()
{printf("test\n");exit(13);return 0;
}

3、_exit和exit

  • exit是库函数,_exit是系统调用
  • exit终止进程的时候,会自动刷新缓冲区;_exit终止进程的时候,不会自动刷新缓冲区

注:缓冲区不在操作系统内部。

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

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

相关文章

牛客周赛 Round 39(A,B,C,D,E,F,G)

比赛链接 官方题解&#xff08;视频&#xff09; B题是个贪心。CD用同余最短路&#xff0c;预处理的完全背包&#xff0c;多重背包都能做&#xff0c;比较典型。E是个诈骗&#xff0c;暴力就完事了。F是个线段树。G是个分类大讨论&#xff0c;出题人钦定的本年度最佳最粪 题目…

RT-Thread学习

RT-Thread三个版本——标准版本 RT-Thread&#xff0c;全称是Real Time-Thread&#xff0c;顾名思义&#xff0c;它是一个嵌入式实时多线程操作系统&#xff0c;基本属性之一是支持多任务&#xff1a;一个处理器核心在某一时刻只能运行一个任务&#xff0c;由于每次对一个任务…

HCIP【ospf综合实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、划分网段 二、配置IP地址 三、搞通私网和公网 &#xff08;1&#xff09;先搞通私网&#xff08;基于OSPF协议&#xff0c;在各个路由器上进行网段的宣告&#xff0c…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

docker部署chatgpt步骤

docker部署 1.启动docker服务 sudo service docker start 2.查看镜像 docker ps -a 3. 运行命令docker run --name chatgpt-web -d -p 1002:3002 --env OPENAI_API_KEYsk-xxxxxx --env AUTH_SECRET_KEY验证密码 --env OPENAI_API_BASE_URLhttps://api.openai.com registry.a…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种&#xff0c;不同的插件对应了不同的调试方法&#xff0c;比如&#xff1a; 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件&#xff08;只针对CMake工程&#xff0c;需要搭配C/C插件一起使用&#xff0c;但无…

Demo 跑不起来

TranslationClient 相关报错删掉。 emoji2 报错&#xff0c;需要单独依赖&#xff1a; api “androidx.emoji2:emoji2:1.0.1” api “androidx.emoji2:emoji2-views-helper:1.0.1” .如果有名片module引入可能需要改下名片中的imkit引入方式&#xff0c;可能会爆出依赖重复导…

Gin框架小结

Gin 简介 Gin是一个轻量级的Web框架&#xff0c;用于构建高性能的Go语言Web应用程序。提供了路由管理、中间件支持、参数绑定和验证、错误处理、静态文件服务等功能。 Gin框架解决了什么问题和痛点 1.golang http 标准库本身提供了比较简单的路由注册能力&#xff0c;只支持…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

清明三天,用Python赚了4万?

每年4月&#xff0c;是Python圈子里接私活的旺季&#xff0c;特别是在节假日这种数据暴增的时间段&#xff0c;爬虫采集、逆向破解类的私活订单会集中爆发&#xff0c;量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好&#xff0c;我昨天就做了一单爬虫逆向私活&#xff…

引领软件供应链安全 比瓴科技位居安全牛全景图第一

近日&#xff0c;安全牛第十一版《中国网络安全行业全景图》正式发布&#xff0c;比瓴科技入选全景图软件供应链安全赛道中开发流程安全管理、DevSecOps和软件成分分析三个重要细分领域&#xff0c;并位居开发流程安全管控领域第一。 安全牛本次全景图研究工作于23年正式启动&a…

什么是云安全?云安全包含哪些方面?

云计算彻底改变了数据存储的世界&#xff0c;它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单&#xff0c;也使得云上数据极易造成泄露或者被篡改&#xff0c;所以云安全就显得非常重要了。那么什么是云安全&#xff1f;云安全的工作原理是什么&#xf…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上&#xff0c;有数以百万计的人对软件开发充满热情&#xff0c;他们有很多名字&#xff0c;如软件工程师、程序员、编码员、开发人员。一段时间后&#xff0c;这些人可能会成为一名优秀的编码员&#xff0c;并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具&#xff0c;它旨在帮助用户从各种存储设备中恢复由于各种原因&#xff08;如误删除、格式化、病毒攻击、系统崩溃等&#xff09;导致丢失的数据。这款软件支持多种存储介质&#xff0c;包括但不限于硬盘驱动器、U盘…

0.5W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPR-W5 系列

TPR-W5系列是一款需要隔离和电压转换的产品&#xff0c;工业级环境温度&#xff0c;温度范围从–40℃到105℃&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波及提供3000V以上的直流电压隔离&#xff0c;用于需要隔离的场合&am…

【Spring系列】- Spring事务底层原理

实验准备 配置文件 首先在配置文件中配置jdbcTemplate和事务管理器&#xff0c;并且需要开启事务的注解EnableTransactionManagement以及Configuration注解 ComponentScan("com.lyd") EnableTransactionManagement Configuration public class ApplicationConfig …

ES6常用语法

1.声明变量: let 和 const let 声明的变量可以被修改&#xff1b;const 声明的变量是常量&#xff0c;不可被修改。 let x 10; const PI 3.14; 2. 箭头函数 更简洁&#xff0c;绑定了词法作用域的 this 值。不会创建自己的 this&#xff0c;而是继承了上下文中的 this 值…

【ITK滤波】第2期 边缘检测

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的边缘检测,及相关实例和算法解析,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO …

StringUtils.join()

源码 public static String join(Iterable<?> iterable, String separator) {return iterable null ? null : join(iterable.iterator(), separator);} 简介 这个函数是一个静态函数&#xff0c;它接受一个可迭代对象和一个分隔符作为参数&#xff0c;并返回一个将可…