信号是一种软件中断,它提供了异步事件的处理机制。信号作为一种进程间通信(IPC)的基本形式,而一个进程可以给另一个进程发送信号。信号本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。
每个信号都有一个以SIG为前缀的符号名称。信号的编号从1开始(通常是SIGHUP)线性增加。总共有大约31个
信号,但是大多数的程序只用到了它们中的一少部分。
信号有三种状态:产生、未决、递达
产生:键盘输入, 函数调用, 执行shell命令, 对硬件进行非法访问都会产生信号
未决:信号产生, 但还没有被处理
递达:信号被处理后
信号相关函数
**signal()**:该函数用于设置信号处理函数,其原型为:
1 |
|
它接受两个参数,signum
表示要捕获的信号类型,func
表示信号处理函数的指针。当收到指定的信号时,系统将调用指定的处理函数。
**kill()**:用于向指定的进程发送信号。其原型为:
1 | int kill(pid_t pid, int sig); |
pid
参数指定了目标进程的进程ID,sig
参数指定了要发送的信号类型。
**raise()**:用于向当前进程发送信号。其原型为:
1 | int raise(int sig); |
sig
参数指定了要发送的信号类型。
**abort()**:给当前进程发送一个固定信号 (SIGABRT),函数原型:
1 |
|
调用 abort()
函数可以快速终止进程,并进行相应的清理工作
**sigpending()**:用于获取当前进程挂起的信号集。其原型为:
1 | int sigpending(sigset_t *set); |
它将当前未决的信号放入由 set
参数指向的信号集中
**sigprocmask()**:用于检查或修改当前进程的信号屏蔽字。其原型为:
1 | int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); |
通过 sigprocmask()
函数可以设置当前进程的信号屏蔽字,从而阻塞或解除阻塞特定的信号。