Linux C/C++信号4

35 篇文章 0 订阅
35 篇文章 0 订阅


一、信号集

我们需要有一个能表示多个信号——信号集( signal set)的数据类型。将在 sigprocmask这样的函数中使用这种数据类型,以告诉内核不允许发生该信号集中的信号。如前所述,信号种类数目可能超过一个整型量所包含的位数,所以一般而言,不能用整型量中的一位代表一种信号。POSIX.1定义数据类型sigset _ t以包含一个信号集,并且定义了下列五个处理信号集的函数。

int sigemptyset(sigset_t *set) ;
int sigfillset(sigset_t *set) ;
int sigaddset(sigset_t *set, int signo) ;
int sigdelset(sigset_t *set, int signo) ;
int sigismember(const sigset_t *set, int signo);

函数sigemptyset初始化由set指向的信号集,使排除其中所有信号。函数 sigfillset初始化由set指向的信号集,使其包括所有信号。所有应用程序在使用信号集前,要对该信号集调用sigemptysetsigfillset一次。这是因为C编译程序将不赋初值的外部和静态度量都初始化为 0,而这是否与给定系统上信号集的实现相对应并不清楚。

一旦已经初始化了一个信号集,以后就可在该信号集中增、删特定的信号。函数 sigaddset将一个信号添加到现存集中, sigdelset则从信号集中删除一个信号。对所有以信号集作为参数的函数,都向其传送信号集地址。

二、代码实例

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

int main()
{
    //创建一个信号集
    sigset_t set;

    //清空信号集的内容
    sigemptyset(&set);

    //判断 SIGINT是否在信号集 set里
    int ret = sigismember(&set,SIGINT);
    if(ret==0)
    {
        printf("SIGINT 不阻塞\n");
    }else if(ret==1)
    {
        printf("SIGINT 阻塞\n");
    }
    else{
        perror("sigismember");
        exit(0);
    }

    //添加几个信号到信号集中
    sigaddset(&set,SIGINT);
    sigaddset(&set,SIGQUIT);

     //判断 SIGINT是否在信号集 set里
    ret = sigismember(&set,SIGINT);
    if(ret==0)
    {
        printf("SIGINT 不阻塞\n");
    }else if(ret==1)
    {
        printf("SIGINT 阻塞\n");
    }
    else{
        perror("sigismember");
        exit(0);
    }

     //判断 SIGQUIT是否在信号集 set里
    ret = sigismember(&set,SIGQUIT);
    if(ret==0)
    {
        printf("SIGQUIT 不阻塞\n");
    }else if(ret==1)
    {
        printf("SIGQUIT 阻塞\n");
    }
    else{
        perror("sigismember");
        exit(0);
    }


    //从信号集中删除信号
    sigdelset(&set,SIGQUIT);

    //判断 SIGQUIT是否在信号集 set里
    ret = sigismember(&set,SIGQUIT);
    if(ret==0)
    {
        printf("SIGQUIT 不阻塞\n");
    }else if(ret==1)
    {
        printf("SIGQUIT 阻塞\n");
    }
    else{
        perror("sigismember");
        exit(0);
    }



    return 0;
}

总结

今天主要给大家介绍了处理信号集的函数及其使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值