Linux下的信号使用总结

主要参考《【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4》信号篇
发送给进程的诸多信号中,大多数都是来自于内核。

信号本质上是 int 类型的数字编号,这就好比硬件中断所对应的中断号。内核针对每个信号,都给其定义了一个唯一的整数编号,从数字 1 开始顺序展开。并且每一个信号都有其对应的名字(其实就是一个宏),信号名字与信号编号乃是一一对应关系,但是由于每个信号的实际编号随着系统的不同可能会不一样,所以在程序当中一般都使用信号的符号名(也就是宏定义)。这些信号在<signum.h>头文件中定义,每个信号都是以 SIGxxx 开头,如下所示:

示例代码 8.1.1 信号定义
/* Signals. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31

可靠信号和不可靠信号

Linux可靠信号和不可靠信号_linux信号稳定可靠吗-CSDN博客

不可靠,会丢失,是不是会出问题?

Linux 信号详解六:可靠信号与不可靠信号 (baidu.com)

有各自的使用场景,需要手动进行选择和处理。

信号捕捉

当进程接收到内核或用户发送过来的信号之后,根据具体信号可以采取不同的处理方式:忽略信号、捕获信号或者执行系统默认操作。Linux 系统提供了系统调用 signal()和 sigaction()两个函数用于设置信号的处理方式。

我们重点学习sigaction函数
除了 signal() 之外, sigaction() 系统调用是设置信号处理方式的另一选择,事实上,推荐大家使用 sigaction() 函数。虽然 signal() 函数简单好用,而 sigaction() 更为复杂,但作为回报, sigaction() 也更具灵活性以及移植性。 sigaction()可以设置各种属性对调用信号处理函数时的行为施以更加精准的控制,其函数原型如下所示:

#include <signal.h>
int sigaction(int signum, const struct sigaction *act, 
                                struct sigaction *oldact);

函数参数和返回值含义如下:
signum 需要设置的信号,除了 SIGKILL 信号和 SIGSTOP 信号之外的任何信号。
act act 参数是一个 struct sigaction 类型指针,指向一个 struct sigaction 数据结构,该数据结构描述了信号的处理方式,稍后介绍该数据结构;如果参数 act 不为 NULL ,则表示需要为信号设置新的处理方式;如果参数 act 为 NULL ,则表示无需改变信号当前的处理方式。
oldact oldact 参数也是一个 struct sigaction 类型指针,指向一个 struct sigaction 数据结构。如果参数oldact 不为 NULL ,则会将信号之前的处理方式等信息通过参数 oldact 返回出来;如果无意获取此类信息,那么可将该参数设置为 NULL 。
返回值: 成功返回 0 ;失败将返回 -1 ,并设置 errno 。
更多内容直接查看《【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4》信号篇吧。

信号集和信号掩码

更多内容直接查看《【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4》信号篇吧。
更多待补充。

相关推荐
黑牛先生1 小时前
【Linux】动静态库
linux·运维·服务器
vortex51 小时前
Shell基础:中括号的使用
linux·运维·bash·shell
基哥的奋斗历程1 小时前
Docker 常用命令
运维·docker·容器
HEX9CF3 小时前
【Docker】快速部署 Nacos 注册中心
运维·docker·容器
从未止步..4 小时前
Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?
java·运维·jenkins
davenian4 小时前
< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)
运维·shell script·baidupcs-go·linux ubuntu
-VE-5 小时前
myshell
linux·c++
喝醉酒的小白5 小时前
几种K8s运维管理平台对比说明
运维·容器·kubernetes
明 庭5 小时前
通过 Docker 部署 pSQL 服务器的教程
服务器·docker·容器
身在江湖的郭大侠7 小时前
Linux内核
linux·服务器