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

发布时间:2026/5/18 0:48:46

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系统文章中我用的ubuntuup主用的centos但原理是相同的不影响技术学习。本笔记无任何商业用途仅供个人学习交流。感谢原up主的课程分享“你有没有想过当你在终端按下 CtrlCLinux 到底对你的程序做了什么”一个进程从诞生到死亡看似只是一瞬间但这一瞬间里内核做了三次善后、两轮信号分发、外加一场资源回收。今天我们就从 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);-----头cstdlibstatus也是进程终止的状态。如果进程被异常终止终止状态为非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()自动调用。头cstdlibint atexit(void (*function)(void));exit()调用终止函数的顺序与登记时相反。 进程退出前的收尾工作代码演示编译运行atexit 登记的函数会在进程正常终止时如 return 0 或 exit(0)被调用调用顺序与登记顺序相反所以输出为调用了func2()调用了func1()改为这样编译运行依然正常输出exit(0)也一样改为下划线的编译运行就啥也没调用再次声明本文章内容均来自本人的个人笔记为个人学习总结参考自B站课程码农论坛《C环境高级编程》。由于当时方便记笔记笔记中部分图片来源于原课程视频截图版权归原作者“码农论坛”及相关权利人所有。对于linux系统文章中我用的ubuntuup主用的centos但原理是相同的不影响技术学习。根据《中华人民共和国著作权法》第二十四条规定本笔记引用上述内容系为个人学习、研究之目的属于“合理使用”范畴不影响原作品的正常使用亦不损害原著作权人的合法权益。本笔记无任何商业用途仅供个人学习交流。感谢原up主的课程分享

相关新闻