0%

信号

信号是一种软件中断,它提供了异步事件的处理机制。信号作为一种进程间通信(IPC)的基本形式,而一个进程可以给另一个进程发送信号。信号本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。

每个信号都有一个以SIG为前缀的符号名称。信号的编号从1开始(通常是SIGHUP)线性增加。总共有大约31个
信号,但是大多数的程序只用到了它们中的一少部分。

信号有三种状态:产生、未决、递达

产生:键盘输入, 函数调用, 执行shell命令, 对硬件进行非法访问都会产生信号

未决:信号产生, 但还没有被处理

递达:信号被处理后

信号相关函数

**signal()**:该函数用于设置信号处理函数,其原型为:

1
2
#include <signal.h>
void (*signal(int signum, void (*func)(int)))(int);

它接受两个参数,signum 表示要捕获的信号类型,func 表示信号处理函数的指针。当收到指定的信号时,系统将调用指定的处理函数。

**kill()**:用于向指定的进程发送信号。其原型为:

1
int kill(pid_t pid, int sig);

pid 参数指定了目标进程的进程ID,sig 参数指定了要发送的信号类型。

**raise()**:用于向当前进程发送信号。其原型为:

1
int raise(int sig);

sig 参数指定了要发送的信号类型。

**abort()**:给当前进程发送一个固定信号 (SIGABRT),函数原型:

1
2
#include <stdlib.h>
void abort(void);

调用 abort() 函数可以快速终止进程,并进行相应的清理工作

**sigpending()**:用于获取当前进程挂起的信号集。其原型为:

1
int sigpending(sigset_t *set);

它将当前未决的信号放入由 set 参数指向的信号集中

**sigprocmask()**:用于检查或修改当前进程的信号屏蔽字。其原型为:

1
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

通过 sigprocmask() 函数可以设置当前进程的信号屏蔽字,从而阻塞或解除阻塞特定的信号。