Linux程序退出处理
Linux程序退出处理
在编程Linux软件的时候,我们会考虑这么一件事情,当程序退出执行(即用Ctrl+C或者其他方式)时,该如何做程序的手尾工作,保存数据呢?避免直接强制退出造成丢失数据等后果。
那么我们就会用到信号这个东西
1 | struct sigaction sa; // 创建一个局部变量 sa,存放“信号处理方案” |
这里的 int signum,表示“当前收到的是哪个信号”。
SIGTERM是“操作系统或别的进程发给这个程序的终止请求信号”。比如:
1 kill <pid>默认发的就是
SIGTERM。你的程序这里:
1 sigaction(SIGTERM, &sa, NULL);意思是:
如果别人给我发SIGTERM,我不要立刻死掉,而是先执行onSignalStop(),做收尾退出。那
exit()会不会触发SIGTERM?
不会,正常情况下不会。顺便补一个常见对比:
SIGINT
通常是Ctrl+CSIGTERM
通常是kill pidSIGKILL
强制杀死,程序来不及清理,不能捕获
比如这个函数:
1 | static void onSignalStop(int signum) |
当系统调用这个函数时,会把信号编号传进来:
SIGINT对应一种编号SIGTERM对应另一种编号
所以 signum 的作用就是告诉你:
“这次到底是哪个信号触发了这个处理函数”。
比如如果想区分处理,就可以写成:
1 | static void onSignalStop(int signum) |
1 | (void)signum; |
意思是:
“我知道这个参数传进来了,但目前我不用它”。
这样写主要是为了消除编译器“未使用参数”的警告。
所以一句话总结:
signum= 信号编号- 用来表示当前收到的是什么信号
- 这份代码暂时没用它,只是统一收到退出类信号后都执行
runtimeRequestStop()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Shuiyee`s Blog!

