Linux Signal (6): 信号屏蔽字

原创 2007年09月25日 15:46:00

1. 概念:

信号屏蔽字就是进程中被阻塞的信号集, 这些信号不能发送给该进程, 它们在该进程中被"屏蔽"了. 后面我们会提到, 实际上它们是被阻塞了.

2. 信号屏蔽函数:

#include <signal.h>

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

成功则返回0, 出错则返回
-1.

sigprocmask函数有3个参数:

  • how: 修改信号屏蔽字的方式.
  • set: 把这个信号集设为新的当前信号屏蔽字. 如果为NULL则不改变.
  • oset: 保存进程旧的信号屏蔽字. 如果为NULL则不保存.

参数中的how可以取3个值:

sigprocmask中的how参数
how 说明
SIG_BLOCK 修改后, 该进程新的信号屏蔽字是其当前屏蔽字和set指向的信号集的并集.
SIG_UNBLOCK 修改后, 该进程新的信号屏蔽字是其当前屏蔽字和set指向的信号集的补集的交集.
SIG_SETMASK 修改后, 该进程新的信号屏蔽字将被set指向的信号集的值代替

 另外要说的是, sigprocmask只为单线程定义的, 在多线程中要使用pthread_sigmask.

3. 未处理的信号:

在调用信号屏蔽的相关函数后, 被屏蔽的信号对于调用进程是阻塞的, 不能发送给调用进程, 因此是未决的. 取得这些阻塞的信号集, 可以通过调用sigpending函数.

#include <signal.h>

int sigpending(sigset_t *set);

成功则返回0, 出错则返回
-1.

4. 实例:

下面通过一个简单的实例来说明这篇文章中所讲到的两个函数.

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

/* SIGQUIT handler */
static void sig_quit(int signo)
{
    printf(
"SIGQUIT is caught "
);
}

int
 main()
{
    sigset_t 
new
, old, pend;

    
/* Handle SIGQUIT */

    
if (signal(SIGQUIT, sig_quit) == SIG_ERR)
    {
        perror(
"signal"
);
        exit(
1
);
    }

    
/* Add SIGQUIT to sigset */

    
if (sigemptyset(&new< 0)
        perror(
"sigemptyset"
);
    
if (sigaddset(&new, SIGQUIT) < 0
)
        perror(
"sigaddset"
);

    
/* Mask SIGQUIT */

    
if (sigprocmask(SIG_SETMASK, &new&old) < 0)
    {
        perror(
"sigprocmask"
);
        exit(
1
);
    }

    printf(
"SIGQUIT is blocked "
);
    printf(
"Now try Ctrl /  "
);

    sleep(
5); /* SIGQUIT will pending */


    
/* Get pending */
    
if (sigpending(&pend) < 0)
        perror(
"sigpending"
);

    
if (sigismember(&
pend, SIGQUIT))
        printf(
"SIGQUIT pending "
);

    
/* Restore signal mask */

    
if (sigprocmask(SIG_SETMASK, &old, NULL) < 0)
    {
        perror(
"sigprocmask"
);
        exit(
1
);
    }

    printf(
" SIGQUIT unblocked "
);
    printf(
"Now try Ctrl /  "
);

    sleep(
5
);

    
return 0
;
}

这个程序在开始的时候用sigprocmask屏蔽了SIGQUIT(ctrl+/触发), 在5秒内触发的该信号将可以从sigpending中获得; 然后程序把SIGQUIT解除屏蔽(恢复以前的屏蔽字), 此时再触发该信号将调用sig_quit信号处理函数.

 

Linux 信号signal处理机制

http://my.oschina.net/chenliang165/blog/125825.     最近写程序,各种bug各种错,有一回程序莫名退出,没报错,也没产生日志和core文件,貌似正常退...
  • tiany524
  • tiany524
  • 2013年11月30日 22:01
  • 13261

Linux signal那些事儿

Linux signal 那些事儿(1) http://blog.chinaunix.net/uid-24774106-id-4061386.html Bean_lee Linux编程,信号是一个让...
  • maimang1001
  • maimang1001
  • 2015年03月06日 17:51
  • 2294

[C/C++标准库]_[初级]_[signal信号浅析]

场景: 1.在程序异常退出时,比如需要关闭外部程序或资源。 2.结构化异常不在这里的讨论范围. #include #include #include #include #include ...
  • infoworld
  • infoworld
  • 2014年01月22日 01:07
  • 2591

Linux 信号signal处理机制、定时器

信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。  信号机制是进程之间相互传递消息的一种方法...
  • mysee1989
  • mysee1989
  • 2014年04月15日 11:15
  • 755

linux signal 用法和注意事项

http://blog.chinaunix.net/uid-9354-id-2425031.html 所以希望能用相同方式处理信号的多次出现,最好用sigaction.信号只出现并处理一次,...
  • ncepubdtb
  • ncepubdtb
  • 2015年01月06日 13:36
  • 2397

《gdb调试之基础篇》

1. gdb介绍 gdb是GNU发布的一款功能强大的程序调试工具,它可以让我们深入洞悉一个程序是怎么运行的,也可以帮我们记录一个程序在崩溃的时候所执行的操作。具体一点它可以帮我们完成下面四件事情: •...
  • miss_acha
  • miss_acha
  • 2015年01月02日 23:15
  • 3387

Linux下Signal信号系统调用

前面两节已经介绍了有关信号的大部分知 识。这一节我们来了解一下这些系统调用。其中,系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。这 两个调用可以形成...
  • faihung
  • faihung
  • 2017年04月04日 23:39
  • 633

unix/linux下信号处理函数Signal()详解

signal()函数理解 在 这个头文件中。 signal(参数1,参数2); 参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信...
  • elfprincexu
  • elfprincexu
  • 2015年04月28日 10:08
  • 1874

linux的信号的基本概念

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。      进程之间可以互相通过系统调...
  • coolmeme
  • coolmeme
  • 2013年07月17日 15:15
  • 1119

Linux signal 那些事儿(4)信号的deliver顺序

signal
  • Fybon
  • Fybon
  • 2017年03月29日 17:06
  • 503
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux Signal (6): 信号屏蔽字
举报原因:
原因补充:

(最多只允许输入30个字)