转载from:https://blog.csdn.net/engineer_james/article/details/83867809
在https://blog.csdn.net/engineer_james/article/details/83867466 写一个android进程后台的过程
但是我们用CPP C 开发避免不了 分配内存或者 指针,如果在linux 进程跑的时候,出现死了或者退出导致中断,但是资源没有正常释放,造成资源浪费,所以需要用signal 处理
signal是linux系统的对所有动作的捕捉,然后进行处理
/* SIGNALS /
// #define SIGINT 2 / interrupt Ctrl-C*/
// #define SIGILL 4 /* illegal instruction - invalid function image /
// #define SIGFPE 8 / floating point exception /
// #define SIGSEGV 11 / segment violation /
// #define SIGTERM 15 / Software termination signal from kill /
// #define SIGBREAK 21 / Ctrl-Break sequence /
// #define SIGABRT 22 / abnormal termination triggered by abort call */
信号 取值 默认动作 含义(发出信号的原因)
SIGHUP 1 Term 终端的挂断或进程死亡
SIGINT 2 Term 来自键盘的中断信号
SIGQUIT 3 Core 来自键盘的离开信号
SIGILL 4 Core 非法指令
SIGABRT 6 Core 来自abort的异常信号
SIGFPE 8 Core 浮点例外
SIGKILL 9 Term 杀死
SIGSEGV 11 Core 段非法错误(内存引用无效)
SIGPIPE 13 Term 管道损坏:向一个没有读进程的管道写数据
SIGALRM 14 Term 来自alarm的计时器到时信号
SIGTERM 15 Term 终止
SIGUSR1 30,10,16 Term 用户自定义信号1
SIGUSR2 31,12,17 Term 用户自定义信号2
SIGCHLD 20,17,18 Ign 子进程停止或终止
SIGCONT 19,18,25 Cont 如果停止,继续执行
SIGSTOP 17,19,23 Stop 非来自终端的停止信号
SIGTSTP 18,20,24 Stop 来自终端的停止信号
SIGTTIN 21,21,26 Stop 后台进程读终端
SIGTTOU 22,22,27 Stop 后台进程写终端
SIGBUS 10,7,10 Core 总线错误(内存访问错误)
SIGPOLL Term Pollable事件发生(Sys V),与SIGIO同义
SIGPROF 27,27,29 Term 统计分布图用计时器到时
SIGSYS 12,-,12 Core 非法系统调用(SVr4)
SIGTRAP 5 Core 跟踪/断点自陷
SIGURG 16,23,21 Ign socket紧急信号(4.2BSD)
SIGVTALRM 26,26,28 Term 虚拟计时器到时(4.2BSD)
SIGXCPU 24,24,30 Core 超过CPU时限(4.2BSD)
SIGXFSZ 25,25,31 Core 超过文件长度限制(4.2BSD)
SIGIOT 6 Core IOT自陷,与SIGABRT同义
SIGEMT 7,-,7 Term
SIGSTKFLT -,16,- Term 协处理器堆栈错误(不使用)
SIGIO 23,29,22 Term 描述符上可以进行I/O操作
SIGCLD -,-,18 Ign 与SIGCHLD同义
SIGPWR 29,30,19 Term 电力故障(System V)
SIGINFO 29,-,- 与SIGPWR同义
SIGLOST -,-,- Term 文件锁丢失
SIGWINCH 28,28,20 Ign 窗口大小改变(4.3BSD, Sun)
SIGUNUSED -,31,- Term 未使用信号(will be SIGSYS)
##signal 使用
signal函数的原型
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数1:signum 表示上面的动作编号
参数2:捕捉到信号需要的函数地址
如果是 SIG_IGN表示 屏蔽该信号 而设置 SIG_DFL 表示恢复默认行为 就是继续捕捉
所以在初始化的时候,设置需要捕捉的信号
signal(SIGINT, signal_handler);//ctrl+c signal_handler捕捉信号需要处理的函数
void signal_handler(int param){
signal(SIGINT, SIG_IGN);//忽略后面的信号捕捉
//释放资源
exit(0);
}
用起来很简单,但是对资源释放很有作用