信号——block+pending+handler表

🚀信号代码🚀
🎭我的代码仓库🎭
🎨和我一起学习吧🎨

信号
🧩基础知识
🧩信号集操作
  🧩相关函数
  ✨示例——验证信号对应的新的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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值