#include <signal.h>
int sigprocmask( int how, const sigset_t * restrict set, sigset_t *restrict oset);
返回值:若成功则返回0,若失败则返回-1
首先,如果oset是非空指针,那么进程的当前信号屏蔽字通过oset返回
其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。
How的三种取值:
SIG_BLOCK 该进程新的信号平别字是起当前信号平别字和set指向信号集的并集。set包含了我们希望阻塞的附加新号。
SIG_UNBLOCK 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集部际的交集。set包含了我们希望解除阻塞的信号。
SIG_SETMASK 该进程新的信号屏蔽字将被set指向的信号集的值代替。
一个例子:P259
#include "apue.h"
#include "myerr.h"
static void sig_quit(int);
int main( void )
{
sigset_t newmask;
sigset_t oldmask;
sigset_t pendmask;
if ( signal(SIGQUIT, sig_quit) == SIG_ERR)
{
err_sys("can't catch SIGQUIT");
}
/*
* Block SIGQUIT and save current signal mask
*/
sigemptyset( &newmask );
sigaddset( &newmask, SIGQUIT);
if ( sigprocmask( SIG_BLOCK, &newmask, &oldmask) < 0 )
{
err_sys("SIG_BLOCK error");
}
sleep(5); /*SIG_QUIT here will remain pending*/
if (sigpending( &pendmask) < 0)
{
err_sys("sigpending error");
}
if ( sigismember( &pendmask, SIGQUIT) )
{
err_sys("\nSIGQUIT pending\n");
}
/*Reset signal mask which unblocks SIGQUIT*/
if ( sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
err_sys("SIG_SETMASK error");
}
printf("SIGQUIT unblocked\n");
sleep(5); /*SIGQUIT here will terminate with core file*/
exit(0);
}
static void sig_quit(int signo)
{
printf("caught SIGQUIT\n");
if ( signal(SIGQUIT,SIG_DFL) == SIG_ERR)
{
err_sys("can't reset SIGQUIT");
}
}
分享到:
相关推荐
10.12 sigprocmask函数 10.13 sigpending函数 10.14 sigaction函数 10.15 sigsetjmp和siglongjmp函数 10.16 sigsuspend函数 10.17 abort函数 10.18 system函数 10.19 sleep函数 10.20 作业...
6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并具有某些应用Unix的经验,那么对阅读本书是...
10.12 sigprocmask函数 258 10.13 sigpending函数 259 10.14 sigaction函数 261 10.15 sigsetjmp和siglongjmp函数 266 10.16 sigsuspend函数 268 10.17 abort函数 274 10.18 system函数 276 10.19 ...
246 10.7 SIGCLD语义 248 10.8 可靠信号术语和语义 250 10.9 kill和raise函数 251 10.10 alarm和pause函数 252 10.11 信号集 256 10.12 sigprocmask函数 258 10.13 sigpending函数 259 10.14 ...
10.12 sigprocmask函数 258 10.13 sigpending函数 259 10.14 sigaction函数 261 10.15 sigsetjmp和siglongjmp函数 266 10.16 sigsuspend函数 268 10.17 abort函数 274 10.18 system函数 276 10.19 ...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...
10.12 sigprocmask函数258 10.13 sigpending函数259 10.14 sigaction函数261 10.15 sigsetjmp和siglongjmp函数266 10.16 sigsuspend函数268 10.17 abort函数274 10.18 system函数276 10.19 sleep函数280 ...
10.12 sigprocmask函数258 10.13 sigpending函数259 10.14 sigaction函数261 10.15 sigsetjmp和siglongjmp函数266 10.16 sigsuspend函数268 10.17 abort函数274 10.18 system函数276 10.19 sleep函数280 ...
信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 ...sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 ...
信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 ...sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 ...
信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 ...sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 ...
信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 ...sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 ...
信号 198 10.1 引言 198 10.2 信号的概念 198 10.3 signal函数 203 ...sigprocmask 函数 220 10.13 sigpending函数 222 10.14 sigaction函数 223 10.15 sigsetjmp 和siglongjmp函数 226 10.16 ...
2.2. 实例剖析 2.3. 数据块寻址 2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. ...
3.3. sigprocmask 3.4. sigpending 4. 捕捉信号 4.1. 内核如何实现信号的捕捉 4.2. sigaction 4.3. pause 4.4. 可重入函数 4.5. sig_atomic_t类型与volatile限定符 4.6. 竞态条件与sigsuspend函数 4.7. 关于SIGCHLD...