C语言signal(),打印停止时的信息

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值