✨信号
🧩基础知识
🧩信号集操作
🧩相关函数
✨示例——验证信号对应的新的handler表方法
✨示例——打印pending表
✨示例——在发出一个信号的同时屏蔽多个信号
✨信号捕捉时机
✨信号
注意 :这由三张表,block
只能添加修改
,pending
只能获取
, handler
只能修改
🧩基础知识
- 抵达——> 执行 / 忽略
- sigset_t 信号集
被阻塞的信号
产生时将保持在未决
状态,直到进程解除对此信号的阻塞
,这个信号需要立即被抵达
信号在被block
,信号可以接收多次,但是只能记录一次
,而且是最新的一次
信号的执行只能由OS来执行
,因为信号需要加入PCB
中,操作PCB的只有OS可以执行信号
被接收到的时候并不是立即执行
,而是选择一个合适的时间
进行执行,什么时候执行是由OS来决定的- 信号在
抵达
的时候,需要将这个信号加入block表
,直到执行结束才能解除block
9——SIGKILL,19——SIGSTOP不能被屏蔽
kill -l
查看所有信号1-31——普通信号,可能丢失
,不支持排队;34-64——实时信号,不会丢失
,可以排队
🧩信号集操作
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
使用这个函数改变某个特定的信号对应的处理方法—— handler 表中的方法
#include<stdlib.h>
void abort(void);
发送特定的信号6) SIGABRT
——终止进程
#include<signal.h>
int raise(int sig);
向当前进程发送指定信号
使用示例
void handler(int sem)
{
puts("接受3号信号");
}
void test1()
{
signal(3,handler);
}
int main()
{
int cnt=5;
while(cnt--)
{
printf("%ds后发送3号信号\n",cnt);
sleep(1);
}
raise(3);// 发送3号信号
return 0;
}
🧩相关函数
#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);