#include<signal.h>
int sigsuspend(const sigset_t *sigmask);
返回值:-,并将errno设置为EINTR

  将进程的信号屏蔽字设置为由sigmask指向的值,在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。

例子:

  利用sigsuspend函数阻塞子进程;

 #include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h> sig_atomic_t sigflag;
sigset_t newmask,oldmask,zeromask; void sig_int(int signo)
{
sigflag = ;
} void tell_wait(void)
{
sigflag = ;
if(signal(SIGUSR1,sig_int) == SIG_ERR){
printf("signal error!\n");
exit();
}
printf("after signal!\n");
/*
sigemptyset(&newmask);
sigemptyset(&zeromask);
sigaddset(&newmask,SIGINT);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0){
printf("sigprocmask error!\n");
exit(1);
}
*/
} void tell_child(pid_t pid)
{
kill(pid,SIGUSR1);
} void wait_parent(void)
{
while(sigflag == )
sigsuspend(&zeromask); sigflag = ; if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < ){
printf("sigprocmask erro!\n");
exit();
}
} int main(int argc, char *argv[])
{
pid_t pid; printf("before signal!\n"); tell_wait(); if((pid = fork()) < ){
printf("fork error!\n");
exit();
}
else if(pid == ){
wait_parent();
printf("this is child!\n");
exit();
}
else{
printf("this is parent!\n");
tell_child(pid);
}
exit();
}

例子中的sigprocmask函数是用来检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。

#include<signal.h>

int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
//返回值:成功返回0,出错返回-1

how: SIG_BLOCK   SIG_UNBLOCK   SIG_SETMASK

sigprocmask配合sigpending函数使用,

#include<signal.h>

int sigpending(sigset_t *set);
//返回值:成功返回0,出错返回-1

sigpending函数:查询被搁置的信号!

其实sigsuspend是一个原子操作,包含4个步骤:

(1) 设置新的mask阻塞当前进程;
(2) 收到信号,恢复原先mask;
(3) 调用该进程设置的信号处理函数;
(4) 待信号处理函数返回后,sigsuspend返回。

pause函数和sigsuspend函数的区别:

简单的说, sigsuspend = unblock + pause     
sigsuspend 函数是用于需要先接触 某个信号的阻塞状态 然后等待该信号发生 这样的应用场景; 而使用 pause 在达到这样的效果时肯定是需要先 调用sigprocmask进行取消阻塞,再调用pause去等待,取消阻塞与等待两步之间有时间窗口,在信号发生在调用pause之前任意时刻的话都有可能导致pause之后再也收不到该信号,也就是永远休眠。为了解决这种情况,sigsuspend函数把这两步做成一个原子操作,这就保证不会丢失(错过)信号,也就不会发生永远休眠这种情况(根本不发生该信号时除外)。所以,建议只用sigsuspend去等待信号。

【C】——利用sigsuspend函数等待信号阻塞进程的更多相关文章

  1. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

  2. Linux 等待信号(sigsuspend)

    /* sigsuspend()函数说明 */ #include <stdio.h> #include <signal.h> /* 知识补充: sigsuspend()函数 函数 ...

  3. APUE学习笔记5——信号、信号集和进程信号屏蔽字

    1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...

  4. 信号之sigsuspend函数

    更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞.使用这种技术可以保护不希望由信号中断的代码临界区.如果希望对一个信号解除阻塞,然后pause等待以前被阻塞的信号发生,则又将如何呢?假定信 ...

  5. 【C】——sigprocmask 阻塞进程信号

    1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2.信号阻塞和忽略信号的区别. 阻塞的概念和忽略 ...

  6. UNIX环境高级编程——sigqueue、sigsuspend函数

    一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. int sigqueue(pid_t pid, int sig, ...

  7. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  8. 竞态条件与sigsuspend函数

    一.利用pause和alarm函数实现sleep函数 #include <unistd.h> int pause(void); pause函数使调用进程挂起直到有信号递达.如果信号的处理动 ...

  9. UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字

    lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...

随机推荐

  1. office2010激活 错误代码0X8007000D,KMS激活0x8007000D错误解决办法,亲测成功激活

    只针对VL版本 注意:此方法只对VL版本的,或者是MSDN版本通过替换文件转为VL版本的Office2010有效.零售版本的就别指望KMS激活了. 怎么看自己是不是VL版本的,只要看帮助里面激活的地方 ...

  2. leetcode第一刷_Combinations

    生成组合数是初中的知识,没有人不知道. 组合数学我觉得是最有意思的数学分支,室友应该是这方面的专家,他的纸牌问题我听都听不懂.. 不知道你们是什么感觉.我以看到组合数,立即会想到全排列.这可能是由于当 ...

  3. RecyclerView中实现headerView,footerView功能

    之前用com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader 不过局限性有点大. (com.bartoszlipinski.recycler ...

  4. [svc]ext4文件删除&访问原理

    文件名信息存放在哪里? LINUX的文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...

  5. DatePicker的分割线颜色设置

    /** * * 设置时间选择器的分割线颜色 * @param datePicker */ private void setDatePickerDividerColor(DatePicker dateP ...

  6. 了解HTTP协议栈(实践篇)

    关于http协议的理论知识,我在这里就不详细说明了,具体下面给出的链接有.接下来都是用具体的操作显示的,各位可以结合起来看. 一.使用nc打开端口,并使用浏览器进行访问 (对应文章中的HTTP协议详解 ...

  7. 隐藏Tengine的版本信息

    http { ..... server_tokens on; server_info on; server_tag bass; reset_timedout_connection on; keepal ...

  8. nodejs中的框架介绍

    Sequelize 关系型数据库对象模型映射框架 mongoose 非关系型数据库文档模型映射框架

  9. java park unpark

    https://blogs.oracle.com/dave/a-race-in-locksupport-park-arising-from-weak-memory-models https://blo ...

  10. Flink papers

    Around 2009 the Stratosphere research project started at the TU Berlin which a few years later was s ...