linux c开发: 在程序退出时进行处理
有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源。c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理。这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用。
- 先看正常退出,即调用exit或者main函数return亦或最后一个线程正常退出时,如何捕获退出事件。
使用atexit函数。头文件:#include<stdlib.h>
, 函数原型:void atexit(void (*func)(void));
atexit可以调用多次,注册多个回调函数,在进程退出时调用,同一个函数可以被注册多次。使用示例:
1 2 3 4 5 6 7 8 9 10 | void server_on_exit( void ) { //do something when process exits } int main( int argc, char *argv[]) { atexit (server_on_exit); return 0; } |
- 再看异常退出,如abort,响应某些signal的默认处理是异常退出,还有直接kill进程。
处理方法是使用signal函数,注册自己的回调函数,而避免系统默认的回调,系统默认的回调可能就是直接crash掉程序。使用例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <signal.h> void signal_crash_handler( int sig) { server_backtrace(sig); exit (-1); } void signal_exit_handler( int sig) { exit (0); } int main( int argc, char *argv[]) { atexit (server_on_exit); signal (SIGTERM, signal_exit_handler); signal (SIGINT, signal_exit_handler); // ignore SIGPIPE signal (SIGPIPE, SIG_IGN); signal (SIGBUS, signal_crash_handler); // 总线错误 signal (SIGSEGV, signal_crash_handler); // SIGSEGV,非法内存访问 signal (SIGFPE, signal_crash_handler); // SIGFPE,数学相关的异常,如被0除,浮点溢出,等等 signal (SIGABRT, signal_crash_handler); // SIGABRT,由调用abort函数产生,进程非正常退出 return 0; } |
这个例子里面其实是将异常退出处理和正常退出处理结合起来了。对于SIGTERM(即kill进程)和SIGINT(即ctrl-c结束前台进程),我们当做是正常退出,在其信号处理函数里面,直接调用了exit(0),而exit(0)又会被server_on_exit捕获到。对于异常退出也是类似,只是调用了exit(-1)表示是异常的。同时异常退出我们会打印出当前的进程堆栈信息,server_backtrace的实现下一篇再说。另外注意的是SIGKILL信号是无法捕获的。而调用abort导致的退出,也是通过SIGABRT信号捕获到进行处理了。其他几种异常退出的信号也是比较常见,一并捕获到进行处理。这样对于异常退出,我们即可统一的log堆栈信息,又可直接继续正常退出时的处理流程了。
坚持就是胜利
分类:
linux c
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架