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

相关推荐
SPC的存折15 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
爱学习的小囧16 小时前
VMware ESXi 6.7U3v 新版特性、驱动集成教程和资源包、部署教程及高频问答详情
运维·服务器·虚拟化·esxi6.7·esxi蟹卡驱动
小疙瘩16 小时前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
dldw77716 小时前
IE无法正常登录windows2000server的FTP服务器
运维·服务器·网络
运维有小邓@17 小时前
什么是重放攻击?如何避免成为受害者?
运维·网络·安全
我是伪码农17 小时前
外卖餐具智能推荐
linux·服务器·前端
汤愈韬18 小时前
下一代防火墙通用原理
运维·服务器·网络·security
皮皮林55118 小时前
强烈建议大家使用 Linux 做开发?
linux
IMPYLH18 小时前
Linux 的 od 命令
linux·运维·服务器·bash
Kk.080219 小时前
Linux(十一)fork实例练习、文件操作示例及相关面试题目分享
linux·运维·算法