#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");
}
}
分享到:
相关推荐
以下是一个简单的示例,演示如何使用`alarm`函数: ```c #include #include #include int main() { unsigned int i; alarm(1); // 设置1秒后发送SIGALRM信号 for (i = 0; 1; i++) { printf("I=%d\n", i); ...
4. **信号屏蔽**:`sigprocmask()`函数允许你暂时阻止某些信号的传递,确保在特定时刻不会被信号打扰,这对于需要连续执行的代码块特别有用。 5. **信号集**:信号集是一个数据结构,用于存储多个信号。`...
- **信号屏蔽**:理解信号屏蔽的概念,以及如何使用sigprocmask函数来实现信号的屏蔽或解除屏蔽。 ##### 4. 内存管理 - **动态内存分配**:讲解如何使用malloc、free等函数来分配和释放内存。 - **共享内存**:...
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 作业...
使用`sigprocmask`函数可以获取调用线程的信号掩码。 ##### 安全地Fork 在使用`fork`创建子进程时,需要注意与线程相关的安全问题。 ##### 终止线程 使用`pthread_cancel`函数可以请求终止线程。 #### 四、线程...
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 ...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库, PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...
在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...
2. 信号掩码:通过`sigprocmask()`函数,我们可以改变进程的信号掩码,决定哪些信号当前被阻塞,哪些可以被接收。 四、高级用法 1. 信号重载:在某些情况下,可能需要改变默认的信号处理方式,比如让SIGPIPE信号不...
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 ...