linux c开发: 在程序退出时进行处理

linux c开发: 在程序退出时进行处理,第1张

有时候,希望程序退出时能进行一些处理,比如保存状态丛和,释放一些资源。c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理。这里总结一下这些情况,如何获取拆敏一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用。

这个例子里面其实是将异常退出处理和正常退出处理结合起来了旅郑枝。对于SIGTERM(即kill进程)和SIGINT(即ctrl-c结束前台进程),我们当做是正常退出,在其信号处理函数里面,直接调用了exit(0),而exit(0)又会被server_on_exit捕获到。对于异常退出也是类似,只是调用了exit(-1)表示是异常的。同时异常退出我们会打印出当前的进程堆栈信息,server_backtrace的实现下一篇再说。另外注意的是SIGKILL信号是无法捕获的。而调用abort导致的退出,也是通过SIGABRT信号捕获到进行处理了。其他几种异常退出的信号也是比较常见,一并捕获到进行处理。这样对于异常退出,我们即可统一的log堆栈信息,又可直接继续正常退出时的处理流程了。

#include<局陵stdio.h>

#include <stdlib.h>

void main()

{

int i=0

printf("1.执行1 *** 作\n2.执行2 *** 作\n3.退出\n")

printf("请输入你所需的 *** 作\n")

scanf("%d",&i)

switch(i)

{

case 1:printf("1 *** 作")break

case 2:printf("2 *** 作"高凯)break

case 3:system("桐念戚exit")break

default:break

}

system("pause")

}

用trap命令,正常退出调用的应该是SIGHUP(1),非正简掘常退出根据情况差简不同调用SIGINT(2), SIGQUIT(3),SIGTERM(15)。一般情况的退出基本上1 2 3 15都能包括了。

例:

##################################

#!/bin/sh

trap`echo get_messages` 1 2 3 15

##################################

其中用``包含的部分写你要执行的脚本或者命令。

后面的1 2 3 15是捕捉的SIGNAL的号码

★上面例子虚咐裤的意思是:当所执行的process接收到SIGHUP(1),SIGINT(2), SIGQUIT(3), SIGTERM(15)信号的时候,输出get_messages然后终止程序。

※如果你要执行复杂脚本或者命令的话,建议你把他写成函数

比如:

#################################

#!/bin/sh

trap `echo_many_messages` 1 2 3 15

echo_many_messages(){

echo a

echo b

echo c

}

##################################


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12244608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存