波奇学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()。

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

相关推荐
loong_XL2 小时前
docker gpu容器镜像环境构建
运维·docker·容器
杨了个杨89823 小时前
nginx常见功能部署
运维·服务器·nginx
小天源5 小时前
linux漏洞一键扫描
linux·运维·服务器·漏洞扫描
eWidget5 小时前
InfluxDB迁移至金仓数据库的同城容灾实践:性能显著提升、运维效率优化,某能源企业实现RPO_5秒的高可靠时序数据管理
运维·数据库·能源·时序数据库·kingbase·kingbasees·金仓数据库
m0_696212685 小时前
个人微信api
运维·服务器
en-route6 小时前
SSH Key 与 GPG Key 区别详解:Git 使用中的身份与签名机制
运维·git·ssh
Web极客码6 小时前
区块链第 1 层与第 2 层有什么区别?
服务器·区块链
码农水水6 小时前
中国邮政Java面试被问:容器镜像的多阶段构建和优化
java·linux·开发语言·数据库·mysql·面试·php
wifi chicken7 小时前
Linux Wlan L3~L2封包逻辑详解
linux·网络·ping·封包
小白鸽i8 小时前
【LINUX】将源码驱动文件编译并生效
linux·运维·服务器