波奇学Linux:进程终止

写时拷贝底层原理图

子进程谁先运行,由调度器决定

进程退出场景

代码运行完毕,结果正确:有返回值,返回0

代码运行完毕,结果不正确:有返回值,返回非0

代码异常终止。没有返回值

return 0的含义

0 表示进程的退出码,表示进程运行结果是否正确,0->success

0会给父进程拿到,父进程可以根据退出码,提醒用户出错原因

可以用不同的返回值数字,表示不同的出错原因

echo $? 打印最近一次执行程序的退出码

?像变量一样保存退出码,$?表示取这个变量?的值

C语言的全局变量errno:保存最新错误的库函数退出码(当有几个库函数发生错误时)

当代码运行完毕,结果不正确,可以通过查看errno码查询原因

当进程异常终止,我们不关心退出码

进程出现异常,本质时进程收到对应的信号

进程异常会触发硬件层面的错误,硬件层面错误会给操作系统发出信号。

如野指针错误

查表可知Segmentation fault的信号编号是11

发生11信号编号给系统,普通进程会得到同样的运行的结果,说明进程的异常终止可能存在类似发生信号编号的机制。

退出进程函数exit(库函数)和_exit(系统函数)

exit的参数status就是进程的退出码,在main函数return的值也是退出码

exit函数在任意地方被调用,都表示进程终止,return只在main函数中表示进程结束,在其他函数中表示函数返回。

_exit

_exit同样能终止进程

由图可见,当调用_exit()函数时,hello linux并没有被打印。已知printf的内容会先被保存在缓存区,所有可得exit()退出进程时,刷新的缓存区而_exit退出进程时没有刷新缓存区。

exit()会看到缓存区的结果(printf的内容如果还在缓存区,没有刷新exit()会把缓存区的内容刷新后再退出),_exit()直接终止进程,exit()相当于最后再调用系统函数_exit()。

由此可知缓存区绝对不在内核区。

相关推荐
@兽血沸腾38 分钟前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道4 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界8 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落8 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨8 小时前
WSL2的安装与使用
linux·wsl
微小的鱼9 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng9 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器