UNIX环境高级编程笔记(12)- 函数sigprocmask

 


前言

本章主要介绍函数sigprocmask、给出了打印进程中的信号屏蔽字例程


 

一、函数sigprocmask

#include <signal.h>。

int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);

功能:给一个进程添加或者去掉信号屏蔽子。

参数:若oset为为空指针,那么进程的当前信号屏蔽字通过oset返回。

参数:其次,若set是一个非空指针,则参数how指示如何修改信号屏蔽子,取值分别为:SIG_BLOCK(阻塞 或操作)、SIG_UNBLOCK(非阻塞) SIG_SETMASK(阻塞 赋值操作)。

返回值:正确为0,错误非0.

二、为进程打印信号屏蔽字

代码如下(示例):

void pr_mask(const char *ptr,sigset_t sigset)
{
    //sigset_t sigset;
    int errno_save;


    errno_save = errno;
    if(sigprocmask(0,NULL,&sigset) < 0)
        err_sys("sigprocmask error");
    else{
        printf("%s",ptr);
        if(sigismember(&sigset,SIGINT))
            printf("SIGINT");
        if(sigismember(&sigset,SIGQUIT))
            printf("SIGQUIT");
        if(sigismember(&sigset,SIGUSR1))
            printf("SIGUSR1");
        if(sigismember(&sigset,SIGALRM))
            printf("SIGALRM");

        printf("\n");
    }
    errno = errno_save;
}
void unix_10_14_sigprocmask(void)
{
    sigset_t newmask;
    sigemptyset(&newmask);
    sigaddset(&newmask,SIGQUIT); //添加的信号屏蔽字
    if(sigprocmask(SIG_BLOCK,&newmask,NULL) < 0)
        err_sys("SIG_BLOCK error");
    pr_mask("sigismember:",newmask);//打印信号的屏蔽子

}
#define UNIX_10_14_SIGPROCMASK
int main(int argc, char *argv[])
{
#ifdef UNIX_10_14_SIGPROCMASK
    unix_10_14_sigprocmask();
#endif
    printf("MAIN END\n");
    return 0;
}

 


总结

本章主要讲解了信号屏蔽字相关函数及其用法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
`sigprocmask()` 函数是用于修改进程的信号屏蔽字的函数,它可以阻塞或允许特定的信号。下面是关于 `sigprocmask()` 函数的一些学习笔记: 1. `sigprocmask()` 函数的头文件为 `<signal.h>`。 2. `sigprocmask()` 函数的原型为: ``` int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); ``` - `how` 表示如何修改信号屏蔽字,有三个取值:`SIG_BLOCK`、`SIG_UNBLOCK` 和 `SIG_SETMASK`。分别表示阻塞、解除阻塞和设置信号屏蔽字。 - `set` 表示要修改的信号集合。 - `oldset` 表示原来的信号集合。 3. `sigprocmask()` 函数可以修改进程的信号屏蔽字,控制是否允许或阻塞某些信号的处理。 4. 信号屏蔽字是一个二进制位向量,每个位代表一个信号,如果该位为 1,则表示该信号被屏蔽,不会被处理;如果该位为 0,则表示该信号是允许的,可以被处理。 5. `sigprocmask()` 函数可以使用 `sigemptyset()`、`sigfillset()`、`sigaddset()`、`sigdelset()` 等函数来创建和修改信号集合。 6. `sigprocmask()` 函数可以用于防止信号的竞争条件,例如在多线程程序中使用信号处理函数时,可以使用信号屏蔽字来防止多个线程同时处理同一个信号。 7. `sigprocmask()` 函数还可以用于实现临界区保护,即在进入临界区时,屏蔽某些信号,以防止信号处理函数中断临界区代码的执行。 总之,`sigprocmask()` 函数是一个非常重要且常用的函数,可以用于控制信号的处理,保护临界区等。在学习和使用该函数时,需要注意其参数的含义和使用方法,以及信号屏蔽字的概念和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默默的赶路人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值