这个例子里面其实是将异常退出处理和正常退出处理结合起来了旅郑枝。对于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
}
##################################
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)