Linux运行程序除了kill,无其他打印信息,排查原因可以用signal()
signal.h 头文件定义了一个变量类型 sig_atomic_t两个函数调用一些宏来处理程序执行期间报告的不同信号
signal.h 中定义的【变量类型】
sig_atomic_t 这是 int 类型,在信号处理程序中作为变量使用。
它是一个对象的整数类型,该对象可以作为一个原子实体访问,即使存在异步信号时,该对象可以作为一个原子实体访问。
SIG_ 宏与 signal 函数一起使用来定义信号的功能
1 SIG_DFL 默认的信号处理程序。
2 SIG_ERR 表示一个信号错误。
3 SIG_IGN 忽视信号。
SIG 宏用于表示以下各种条件的信号码:
1 SIGABRT 程序异常终止。
2 SIGFPE 算术运算出错,如除数为 0 或溢出。
3 SIGILL 非法函数映象,如非法指令。
4 SIGINT 中断信号,如 ctrl-C。
5 SIGSEGV 非法访问存储器,如访问不存在的内存单元。
6 SIGTERM 发送给本程序的终止请求信号。
使用方法:
#include <signal.h>
void sighandler(int);
int main()
{
//变量初始化之后添加signal函数,在每次程序停止时会调用该函数。
signal(SIGINT, sighandler);//如果程序是因为SIGINT类型停止,调用该函数。
signal(SIGABRT, sighandler);
signal(SIGBUS, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGSEGV, sig_handler);
signal(SIGTERM, sig_handler);
//如果程序是因为以上几种原因停止的,会打印sighandler里的输出。
return(0);
}
void sighandler(int signum)
{
printf("捕获信号 %d,跳出...\n", signum);
exit(1);
}
处理异常的方案:goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。
为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件<setjmp.h>申明了这些函数及同时所需的jmp_buf数据类型。
int main(int argc, char *argv[])
{
/*aaaaaaaaa*/
if (setjmp(jmpbuf) != 0)
{
printf("===> demo process exit <===\n");
exit(0);
}
//或者
if(setjmp(j) == 0) //setjmp初始化的时候为0
{
printf("\''setjmp\'' is initializing \''j\''\n");
raise_exception();
printf("this line should never appear\n");
}
Else //再次调用时不为0
{
printf("===> demo process exit <===\n");
printf("''setjmp'' was just jumped into\n");
/* this code is the exception handler */
}
*******************///
longjmp(jmpbuf, 1);//会跳到setjmp处
return 0;
}