信号集/信号屏蔽字

1、信号集
类型:sigset_t
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);

 

2、信号屏蔽字
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

 

3、信号处理函数

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

struct sigaction {
  void (*sa_handler)(int);
  void (*sa_sigaction)(int, siginfo_t *, void *);
  sigset_t sa_mask;
  int sa_flags;
  void (*sa_restorer)(void);
};

 

信号屏蔽示例:block.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

static void int_handler(int n)  //中断信号处理函数
{
  write(1,"!",1);
}

int main()
{
  int i,j;
  sigset_t newset,oldset,tmpset;

  signal(SIGINT,int_handler);  //注册中断信号处理函数
  sigemptyset(&newset);    //将新建的信号集清空
  sigaddset(&newset,SIGINT);  //添加中断信号
  sigprocmask(SIG_UNBLOCK,&newset,&oldset);  //解除信号屏蔽并保存信号屏蔽字状态
  sigprocmask(SIG_BLOCK,&newset,&tmpset);  //屏蔽信号并保存旧的屏蔽字状态

  for(j=0;j<100;j++)
  {
    for(i=0;i<5;i++)
    {
      write(1,"*",1);
      sleep(1);
    }
    write(1,"\n",1);
    // sigsuspend(&tmpset);  //下面三句话的原子操作

    /*****************************************************************/

    sigprocmask(SIG_SETMASK,&tmpset,NULL);  //设置屏蔽字取消中断屏蔽
    pause();                   //等待信号到来
    sigprocmask(SIG_SETMASK,&newset,NULL);  //设置屏蔽字屏蔽中断信号

    /*****************************************************************/
  }

  sigprocmask(SIG_SETMASK,&oldset,NULL);  //退出程序前恢复进入时的屏蔽字
  exit(0);
}

posted @   *^VV^*  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示