`

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

相关推荐

    Linux下C语言编程--信号处理函数.

    以下是一个简单的示例,演示如何使用`alarm`函数: ```c #include #include #include int main() { unsigned int i; alarm(1); // 设置1秒后发送SIGALRM信号 for (i = 0; 1; i++) { printf("I=%d\n", i); ...

    每天学点C++(C++实例教程:教程+源码)信号处理.zip

    4. **信号屏蔽**:`sigprocmask()`函数允许你暂时阻止某些信号的传递,确保在特定时刻不会被信号打扰,这对于需要连续执行的代码块特别有用。 5. **信号集**:信号集是一个数据结构,用于存储多个信号。`...

    The Linux Programming Interface(强烈推荐)

    - **信号屏蔽**:理解信号屏蔽的概念,以及如何使用sigprocmask函数来实现信号的屏蔽或解除屏蔽。 ##### 4. 内存管理 - **动态内存分配**:讲解如何使用malloc、free等函数来分配和释放内存。 - **共享内存**:...

    linux多线程编程指南

    使用`sigprocmask`函数可以获取调用线程的信号掩码。 ##### 安全地Fork 在使用`fork`创建子进程时,需要注意与线程相关的安全问题。 ##### 终止线程 使用`pthread_cancel`函数可以请求终止线程。 #### 四、线程...

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

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

    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环境高级编程(PDF)

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

    Linux programming

    2. 信号掩码:通过`sigprocmask()`函数,我们可以改变进程的信号掩码,决定哪些信号当前被阻塞,哪些可以被接收。 四、高级用法 1. 信号重载:在某些情况下,可能需要改变默认的信号处理方式,比如让SIGPIPE信号不...

    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 环境高级编程 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...

    linux 下实现sleep详解及简单实例

    `sigprocmask`函数则用于读取或更改进程的信号屏蔽字,允许我们控制哪些信号会被阻塞,哪些会被接收。通过这些函数的组合使用,我们可以实现更为灵活的睡眠机制。 总结来说,Linux下的`sleep`实现利用了信号机制,...

    UNIX环境高级编程部分

    - **sigprocmask函数**:阻塞或解除阻塞信号。 - **sigpending函数**:检查待处理信号。 - **sigaction函数**:设置信号处理器的高级接口。 - **sigsetjmp/siglongjmp函数**:用于异常处理的非局部跳转。 - **...

    信号系统作业的应用问题

    4. **信号屏蔽**:使用`sigprocmask()`函数可以暂时屏蔽特定信号,防止它们在程序的关键部分被处理,确保程序的执行顺序不被打断。 5. **信号集**:`&lt;signal.h&gt;`库还提供了`sigset_t`类型,用于表示一组信号。`...

    Linux环境高级编程

    书中将介绍如何注册信号处理函数,以及如何使用sigaction()和sigprocmask()等函数来控制信号的行为。 四、文件系统操作 在Linux中,一切皆为文件。文件操作是程序与硬件交互的基础,涉及打开、关闭、读写、定位和元...

Global site tag (gtag.js) - Google Analytics