当前位置: 首页 > news >正文

C库函数signal()信号处理

signal()是ANSI C信号处理函数,原型如下:

#include <signal.h>typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

signal()将信号signum的处置设置为handler,该handler为SIG_IGN(忽略), SIG_DFL(默认),或者是自定义函数的地址。

可以处理的一些信号:

信号名称    值    描述
SIGINT    	2  	Interrupt (ANSI)                	中断;e.g.终端键入DELETE或ctrl+c按键
SIGILL    	4  	Illegal instruction (ANSI)      	非法指令
SIGABRT   	6  	Abort (ANSI)                    	abort()异常终止
SIGBUS    	7  	BUS error (4.2 BSD)             	硬件故障
SIGFPE    	8  	Floating-point exception (ANSI) 	浮点异常
SIGSEGV   	11 	Segmentation violation (ANSI)   	段错误
SIGPIPE   	13 	Broken pipe (POSIX)             	管道破裂
SIGTERM   	15 	Termination (ANSI)              	尽可能终止
SIGSTKFLT 	16 	Stack fault                     	栈异常,默认终止进程
SIGCHLD   	17 	Child status has changed (POSIX)	子进程状态改变

注意:信号SIGKILL和SIGSTOP不能被捕获或忽略。

程序示例:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>void signal_handler(int sig_no)
{printf("handling signal: %d\n", sig_no);
}int main(int argc, char *argv[])
{signal(SIGINT   , signal_handler);signal(SIGILL   , signal_handler);signal(SIGABRT  , signal_handler);signal(SIGBUS   , signal_handler);signal(SIGFPE   , signal_handler);signal(SIGSEGV  , signal_handler);signal(SIGTERM  , signal_handler);signal(SIGSTKFLT, signal_handler);signal(SIGPIPE  , SIG_IGN);signal(SIGCHLD  , SIG_IGN);while(1){sleep(1);}return 0;
}

编译运行程序,开启另一个终端,键入ps命令查看运行程序的PID,键入kill命令给该进程发送不同的信号,示例如下图:

从上面图片中可以看到,SIGSEGV和SIGILL信号被程序捕获然后输出打印信号值,SIGPIPE信号被程序忽略,SIGKILL信号不能被捕获,程序被无条件终止。都符合程序预期。

如果不希望程序遇到段错误等情况就被终止,可以自定义handler函数,捕获相关信号,必要时保存堆栈信息,便于后续定位分析问题。


http://www.mrgr.cn/news/8447.html

相关文章:

  • 20L水箱植保无人机技术详解
  • C++设计模式之组合模式详解
  • 【Docker】gitea的ssh容器直通
  • excel vba将选中区域向下复制指定次数
  • 【精选】基于django柚子校园影院(咨询+解答+辅导)
  • C++11:lambda表达式
  • Java 内部类
  • 探索Swift的精髓:玩转Swift标准库
  • Linux 内核源码分析---netfilter 框架
  • Java | Leetcode Java题解之第355题设计推特
  • 靠近光,学习光,成为光
  • m4a格式音频怎么转成mp3?音频转成mp3的8个方法
  • 基于Spark实现大数据量的Node2Vec
  • 【非常简单】 猿人学web第一届 第12题 入门级js
  • http连接未释放导致生产故障
  • 【模板方法】设计模式:构建可扩展软件的基石
  • JetBrains Rider 2024.2 (macOS, Linux, Windows) - 快速且强大的跨平台 .NET IDE
  • SpringCache源码解析(一)
  • 使用 Tailwind CSS 实现水平和垂直居中对齐的方法
  • 【学习笔记】NTN技术整理