当前位置: 首页 > news >正文

c++ linux环境编程——进程的终止 The termination of a process

目录

I .Methods of process termination

有8种方式可以中止进程,其中5种为正常终止,它们是:

异常终止有3种方式,它们是:

代码演示:exit

注意!

II. Process Termination Status

代码演示:

演示:上述3个函数

III. The issue of resource release(资源释放问题)

代码演示:

IV.Process termination function进程的终止函数

代码演示:


注:

本文章内容均来自本人的个人笔记为个人学习总结,参考自B站课程:码农论坛《C++环境高级编程》。由于当时方便记笔记,笔记中部分图片来源于原课程视频截图,版权归原作者“码农论坛”及相关权利人所有。对于linux系统,文章中我用的ubuntu,up主用的centos,但原理是相同的,不影响技术学习。

本笔记无任何商业用途,仅供个人学习交流。感谢原up主的课程分享!

“你有没有想过,当你在终端按下 Ctrl+C,Linux 到底对你的程序做了什么?”
一个进程从诞生到死亡,看似只是一瞬间,但这一瞬间里,内核做了三次善后、两轮信号分发、外加一场资源回收。今天我们就从 exit 和 return 这两个最常见的“死法”开始,聊聊 Linux 里一个进程是如何体面地离开这个世界的。”

I .Methods of process termination

有8种方式可以中止进程,其中5种为正常终止,它们是:

1)在main()函数用return返回;

2)在任意函数中调用exit()函数;

3)在任意函数中调用_exit()或_Exit()函数;

4)最后一个线程从其启动例程(线程主函数)用return返回;

5)在最后一个线程中调用pthread_exit()返回;

异常终止有3种方式,它们是:

6)调用abort()函数中止;

7)接收到一个信号;

8)最后一个线程对取消请求做出响应。

代码演示:exit

#include <iostream> #include <cstdlib> // 必须包含此头文件以使用 exit() 函数 using namespace std; void func2() { cout << "调用了func2()。\n"; exit(0); } void func1() { cout << "调用了func1()。\n"; func2(); cout << "回到了func1()函数。\n"; } int main(int argc, char *argv[]) { func1(); cout << "回到了main函数。\n"; return 0; }

在vi中是这样的:

编译运行:

当程序运行到exit函数语句时,就会直接退出来,不会再执行,也就是说不会回到func1和main函数中!

若把exit改为return:

注意!

exit(0):这是一个系统调用,作用是直接终止整个程序进程。一旦执行,整个程序立刻结束,不会再执行任何后续代码。所以之前的版本只会输出两行就退出。

return;:这是函数返回语句,作用是结束当前函数(func2)的执行,返回到调用它的地方(也就是 func1() 里 func2(); 的下一行)。

所以现在的执行流程是:

main() 调用 func1()

func1() 输出 “调用了 func1 ()。”,然后调用 func2()

func2() 输出 “调用了 func2 ()。”,然后执行 return;,返回到 func1()

func1() 继续执行,输出 “回到了 func1 () 函数。”,然后 func1() 执行完毕,返回到 main()

main() 继续执行,输出 “回到了 main 函数。”,然后程序正常结束

II. Process Termination Status

在main()函数中,return的返回值即终止状态,如果没有return语句或调用exit(),那么该进程的终止状态是0。在Shell中,查看进程终止的状态:echo $?

正常终止进程的3个函数(exit()和_Exit()是由ISO C说明的,_exit()是由POSIX说明的)。

void exit(int status);

void _exit(int status);

void _Exit(int status);----->头:cstdlib

status也是进程终止的状态。

如果进程被异常终止,终止状态为非0。 服务程序的调度、日志和监控

代码演示:

注释掉main的所有代码:

查看进程终止状态:

修改:

状态变为1

演示:上述3个函数

改为5:

其他两个函数的演示效果是一样的!

III. The issue of resource release(资源释放问题)

在 linux中,一个进程的结束方式,往往决定了它“死得干不干净”。

return是函数的正常返回。
如果在main()return,会先调用局部对象的析构函数,再调用全局对象的析构函数,最后交回控制权给操作系统。

exit()是用来终止进程的。
不会调用局部对象的析构函数,但会调用全局对象的析构函数,并执行一些标准库的清理工作(如刷新缓冲区)。

_exit()_Exit()则更“狠”——它们直接让进程消失,什么清理工作都不做

在实际开发中,依赖析构函数释放资源是很常见的做法。
但如果用了exit()或更极端的退出方式,资源可能永远不会被释放,这对长期运行的程序来说,是致命的隐患。

代码演示:

编译运行:

此时局部对象和全局对象的析构函数都被调用了

若改为exit:

编译运行:

显示只调用了全局对象的析构函数

演示:exit()会执行清理工作,然后退出,_exit()和_Exit()直接退出,不会执行任何清理工作。

改为有下划线的函数:

编译运行:

结果:啥也没调用!!!

IV.Process termination function进程的终止函数

进程可以用atexit()函数登记终止函数(最多32个),这些函数将由exit()自动调用。头:cstdlib

int atexit(void (*function)(void));

exit()调用终止函数的顺序与登记时相反。 进程退出前的收尾工作

代码演示:

编译运行:

atexit 登记的函数会在进程正常终止时(如 return 0 或 exit(0))被调用,调用顺序与登记顺序相反,所以输出为:

调用了func2()

调用了func1()

改为这样:

编译运行:

依然正常输出,exit(0)也一样!

改为下划线的:

编译运行:

就啥也没调用!

再次声明:

本文章内容均来自本人的个人笔记为个人学习总结,参考自B站课程:码农论坛《C++环境高级编程》。由于当时方便记笔记,笔记中部分图片来源于原课程视频截图,版权归原作者“码农论坛”及相关权利人所有。对于linux系统,文章中我用的ubuntu,up主用的centos,但原理是相同的,不影响技术学习。

根据《中华人民共和国著作权法》第二十四条规定,本笔记引用上述内容系为个人学习、研究之目的,属于“合理使用”范畴,不影响原作品的正常使用,亦不损害原著作权人的合法权益。

本笔记无任何商业用途,仅供个人学习交流。感谢原up主的课程分享!

http://www.jsqmd.com/news/507696/

相关文章:

  • Qt+onnxruntime实战:手把手教你部署MaskRCNN模型(附动态尺寸处理技巧)
  • 2026年智慧公厕怎么选?从除臭到管控,五家务实服务商盘点 - 深度智识库
  • B站学软件测试?这7个宝藏UP主带你从入门到精通(附课程链接)
  • 机器视觉零基础入门:(三)图像上采样实战:从原理到代码的像素填充艺术
  • 使用DBeaver连接RisingWave数据库
  • Kubernetes 1.28 集群架构深度解析(kubeadm 部署全景指南)
  • K8s实战:利用Ingress-nginx实现多域名服务暴露与流量管理
  • Nanbeige 4.1-3B部署教程:解决st.markdown(unsafe_allow_html=True)样式冲突
  • YOLO X Layout应用案例:合同、报告、论文文档智能解析实战
  • 告别‘从入门到放弃’:ESP32+MicroPython项目实战,用OLED做个物联网温湿度计
  • 别再乱试了!Jetson Orin (Ubuntu 20.04) SSH无法连接的终极检查清单
  • 异步截屏技术:原理、实现与最佳实践
  • SCMA稀疏码多址技术:从原理到5G应用实践
  • java.net.UnknownHostException 问题解决
  • 2026年降ai保姆级教程:分享5个亲测好用的降ai率工具和2个手动修改技巧,一文搞定ai率 - 殷念写论文
  • 2026年宜昌短视频运营价格内幕:企业如何控制获客成本提升效果 - 精选优质企业推荐榜
  • 惠普在街头现场打印广告牌——每次打印一张 A4 纸
  • 动恰3DV3丨客流统计方案:赋能药店连锁从“经验运营”到“数据驱动”的数字化转型
  • Trae AI + Cloudflare Pages:零成本打造个人博客的保姆级教程(含域名购买指南)
  • 详解Transformer解码器:从掩码机制到自回归生成
  • 嵌入式开发笔记:GT911双I2C地址机制解析(全志T527实战)
  • 梯形图自动生成C代码真的可靠吗?揭秘工业级PLC代码转换中97.3%被忽略的时序陷阱
  • 笔式电化学分析仪选购避坑:IP67防护与电极寿命如何平衡? - 品牌推荐大师1
  • SIwave实战:手把手教你为高速串行信号链路设置Xnet(含Allegro .brd文件导入)
  • 2026口碑街舞培训机构推荐,供你参考,少儿街舞/赛事承办/少儿街舞考级/街舞考级/街舞文化推广,街舞培训基地哪家好 - 品牌推荐师
  • 基于IEEE33节点的碳势计算与可视化展示:精细代码注释助力碳计算与排放学子学习参考
  • Stable Diffusion Web UI本地部署与公网访问全攻略:从零开始玩转AI绘画
  • 哪个机构卫生中级职称考试押题准 - 医考机构品牌测评专家
  • 动态口令登录 Windows:10 分钟实现无硬件双因子认证
  • 2026年阿里云企业邮箱选哪家服务商?正规渠道推荐指南 - 品牌2026