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》信号篇吧。
更多待补充。

相关推荐
maosheng114619 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken19 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.29120 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C20 小时前
CPU Cache
linux·cache
Hoshino.4120 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
恒创科技HK21 小时前
通用型云服务器与计算型云服务器:您真正需要哪些配置?
运维·服务器
吴佳浩 Alben1 天前
GPU 生产环境实践:硬件拓扑、显存管理与完整运维体系
运维·人工智能·pytorch·语言模型·transformer·vllm
播播资源1 天前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry1 天前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
学不完的1 天前
Docker数据卷管理及优化
运维·docker·容器·eureka