`

sigprocmask函数使用实例

 
阅读更多

 

#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");
	}
}
分享到:
评论

相关推荐

    UNIX环境高级编程_第二版中文

    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 作业...

    UNIX高级编程 计算机科学丛书

    6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并具有某些应用Unix的经验,那么对阅读本书是...

    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 ...

    unix环境编程电子书

    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 ...

    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 ...

    UNIX环境高级编程(PDF)

    在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程...

    UNIX环境高级编程 不扣分哦

    在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...

    UNIX环境高级编程中文版

    在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...

    UNIX环境高级编程_第2版.part1

    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 ...

    UNIX环境高级编程_第2版.part2

    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 ...

    UNIX 环境高级编程 part3

    信号 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 ...

    UNIX环境高级编程 part1

    信号 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 ...

    UNIX 环境高级编程 part4

    信号 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 ...

    UNIX 环境高级编程 part2

    信号 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 ...

    UNIX 环境高级编程 part5

    信号 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 ...

    Linux C 一站式学习

    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. ...

    宋劲彬的嵌入式C语言一站式编程

    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...

Global site tag (gtag.js) - Google Analytics