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

Linux 进程终止C/C++

Linux 进程终止C/C++

Linux 进程终止C/C++笔记


一、进程终止的8种方式

1. 正常终止(5种)

  1. main() 函数中使用 return 返回
  2. 程序任意位置调用 exit() 函数
  3. 程序任意位置调用 _exit()_Exit() 函数
  4. 多线程程序中,最后一个线程从启动例程(线程主函数)使用 return 返回
  5. 多线程程序中,最后一个线程调用 pthread_exit() 返回

2. 异常终止(3种)

  1. 调用 abort() 函数中止
  2. 收到未捕获的信号(如 SIGKILLSIGSEGV
  3. 最后一个线程被取消并响应取消请求

二、进程终止状态

  • main() 函数中 return 的返回值即为进程终止状态。
  • 若程序没有 return 语句,也未调用 exit(),进程终止状态默认为 0
  • 在 Shell 中,可通过 echo $? 查看上一个进程的终止状态。
  • 进程异常终止时,终止状态为非 0

三、进程终止相关函数对比

函数 头文件 作用 是否调用全局对象析构 是否调用局部对象析构 是否执行清理(atexit)
return 无(C++关键字) 函数返回,结束进程(仅在 main 中)
exit() <stdlib.h> 正常终止进程
_exit()/_Exit() <unistd.h>/<stdlib.h> 直接终止进程
abort() <stdlib.h> 异常终止进程(产生核心转储)

注意:exit()_Exit() 由 ISO C 标准说明,_exit() 由 POSIX 标准说明。


四、atexit() 进程终止处理函数

1. 作用

进程可以用 atexit() 登记终止函数(最多 32 个),这些函数将在 exit() 被调用时自动执行。

2. 函数原型

#include <stdlib.h>
int atexit(void (*function)(void));

3. 执行规则

  • 调用顺序:与登记顺序相反(先登记的后执行,后登记的先执行)
  • 触发条件:只有 exit()main() 函数正常返回时才会触发;_exit()/abort() 不会触发

4. 示例代码

#include <iostream>
#include <cstdlib>
using namespace std;void func1() {cout << "调用了func1()\n";
}void func2() {cout << "调用了func2()\n";
}int main() {atexit(func1); // 登记第1个进程终止函数atexit(func2); // 登记第2个进程终止函数return 0;
}

输出顺序:

调用了func2()
调用了func1()

五、资源释放问题(return vs exit()

1. return(在 main 中)

  • 会调用局部对象的析构函数
  • 会调用全局对象的析构函数
  • 会执行 atexit() 登记的终止函数

2. exit()

  • 不会调用局部对象的析构函数
  • 会调用全局对象的析构函数
  • 会执行 atexit() 登记的终止函数

3. _exit()/_Exit()

  • 不会调用任何对象的析构函数
  • 不会执行 atexit() 登记的终止函数
  • 直接终止进程,仅关闭文件描述符

示例代码(析构函数对比)

#include <iostream>
#include <cstdlib>
using namespace std;struct AA {string name;AA(const string &str) : name(str) {}~AA() {cout << name << "调用了析构函数。\n";}
};AA a1("对象a1"); // 全局对象int main() {AA a2("对象a2"); // 局部对象// return 0;  // 会调用a2和a1的析构函数exit(0);     // 只会调用a1的析构函数,不会调用a2的析构函数
}

六、易错点总结

  1. returnexit() 都能正常终止进程,但资源释放行为不同。
  2. exit() 只会执行全局对象析构和 atexit 函数,局部对象析构不会被调用。
  3. _exit()/_Exit() 直接退出,不执行任何清理操作。
  4. atexit() 函数调用顺序与登记顺序相反,且仅在 exit()main 正常返回时触发。
http://www.jsqmd.com/news/770624/

相关文章:

  • ShawzinBot:从MIDI到Warframe音乐演奏的革命性转换工具
  • 从1μm精度到断刀检测:2026年高性价比测头品牌排名出炉!工业测头知名制造商 - 深度智识库
  • 高效配置漫画转换工具:5个实用技巧打造完美电子墨水屏阅读体验
  • 为团队统一开发环境使用 TaoToken CLI 一键配置密钥
  • 甘肃省 SCMP 报考官方授权机构及相关指南 - 众智商学院课程中心
  • 【VS Code 零基础配置指南】C/C++ 开发环境从安装到调试全流程:单文件 / 多文件 / CMake 全覆盖
  • 承接全国厂房无尘室洁净室工程:一站式服务公司哪家做的好? - 品牌2026
  • 终极指南:如何用FF14钓鱼计时器轻松捕获鱼王
  • 别只pip install了!深入理解sentence_transformers在PyG MovieLens示例中的角色与替代方案
  • MAA助手:明日方舟玩家的智能管家,三分钟解放双手的终极方案
  • 佛山市添明再生资源:佛山市生铁粉销售厂家有哪些 - LYL仔仔
  • 亨得利名表维修服务公告:唯有原厂配件与专业设备,才能成就一次安心托付 - 亨得利腕表维修中心
  • Streaming输出工程2026:让AI应用的响应感觉快10倍的技术实现
  • 2026 全自动咖啡机哪个牌子好?哪家质量好技术强,靠谱品牌推荐 - 品牌2026
  • 3个关键步骤解决在线视频保存难题:VideoDownloadHelper完全指南
  • 2026环京养老房选购指南|观澜墅 VS 四大竞品深度测评 - 品牌2026
  • 冷热冲击试验箱本地供应商推荐,上海览浩实测,10年深耕环测设备领域 - 品牌推荐大师1
  • 大二学生实战:手把手教你用IDEA+PHPStudy本地部署Litemall开源商城(附完整避坑记录)
  • dlssg-to-fsr3:打破技术壁垒,让AMD显卡也能享受帧生成黑科技
  • Path of Building:5个技巧让你成为流放之路Build规划大师
  • 为什么头部金融机构已在48小时内部署AISMM?SITS2026合规窗口期倒计时72小时,速领部署手册
  • 青岛合创惠民起重设备:市北区靠谱的吊车租赁公司找哪家 - LYL仔仔
  • 别再手动算CRC了!用STM32CubeIDE的Post-build脚本,一键生成带校验的固件
  • 体验 Taotoken 官方价折扣后模型调用的成本优化效果
  • 小程序商城怎么选才能符合自己的需求|2026选型全攻略 - FaiscoJeff
  • Newtonsoft.Json-for-Unity:专为Unity IL2CPP构建优化的高性能JSON序列化解决方案
  • Obsidian Tasks终极指南:如何用6个优先级符号高效管理你的知识库任务
  • 【AI 对齐里程碑】【Anthropic】【MSM】新方法:先教价值观再守规则,模型未知场景失控率从 54% 骤降至 7%
  • 从手机充电头到电动车:拆解身边实物,聊聊增强型MOSFET的选型与实战应用
  • 2026武夷山文旅住宿推荐榜|本土实力酒店盘点,凯乐福酒店领衔高品质度假新标杆 - 江湖评测