10 对sigprocmask,sleep 函数的理解(sigsuspend)

原创 2012年03月26日 17:48:02

10.12 stevens 在阐述sigprocmask函数时 “在调用sigprocmask后如果有任何未决的,不在阻塞的信号,则在sigprocmask返回前,至少会将其中一个信号递送给该进程”

10.14 stevens "在休眠期间(sleep函数执行期间)如果产生了推出信号,那么此时该信号是未决的,但是不在受阻塞,所以在sigprocmask返回之前,它被递送到调用进程。

10.19 sleep 函数的实现

#include "apue.h"
static void
sig_alrm(int signo)
{
/* nothing to do, just returning wakes up sigsuspend() */
}
unsigned int
sleep(unsigned int nsecs)
{
struct sigaction newact, oldact;
sigset_t newmask, oldmask, suspmask;
unsigned int unslept;
/* set our handler, save previous information */
newact.sa_handler = sig_alrm;
sigemptyset(&newact.sa_mask);
newact.sa_flags = 0;
sigaction(SIGALRM, &newact, &oldact);
/* block SIGALRM and save current signal mask */
sigemptyset(&newmask);
sigaddset(&newmask, SIGALRM);
sigprocmask(SIG_BLOCK, &newmask, &oldmask);
alarm(nsecs);
suspmask = oldmask;
sigdelset(&suspmask, SIGALRM); /* make sure SIGALRM isn't blocked */
sigsuspend(&suspmask); /* wait for any signal to be caught */
/* some signal has been caught, SIGALRM is now blocked */
unslept = alarm(0);
sigaction(SIGALRM, &oldact, NULL); /* reset previous action */
/* reset signal mask, which unblocks SIGALRM */
sigprocmask(SIG_SETMASK, &oldmask, NULL);
return(unslept);
}

在第25行,使用了sigsuspend函数,所以sleep函数的调用内部调用了sigsuspend函数,解释了为什么在   阻塞的区间内,sleep 函数 执行过程中 递送该信号可以被处理,而不会被阻塞

代码位于 10.13 中的程序10.11


相关文章推荐

sigprocmask , sigpending 和 sigsuspend函数

sigprocmask函数: 功能描述: 设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。 用法: #include int sigprocmask(int how, ...
  • elbort
  • elbort
  • 2012年05月24日 11:22
  • 2867

sigsuspend sigprocmask函数的使用方法

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。 #include int sigpro...

Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue

写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激! 如果发现一些笔...
  • glianyi
  • glianyi
  • 2014年07月12日 22:23
  • 631

sigprocmask和sigsuspend转

有2个函数 sigprocmask和sigsuspendsigprocmask系统调用用于改变当前阻塞信号集,比如进程想阻塞SIGMIN+1信号。就把这个信号加入掩码中,然后调用 sigprocmas...

apue2 第十章 信号:Unix/Linux信号阻塞(sigaction sigprocmask sigsuspend)

#include #include #include #include #include #include void sig_int(int); int main(int arg...

Linux sigsuspend与sigprocmask使用详解

1.sigsuspend()函数作用详解 一个错误示例: 参考APUE中的代码: 1)头文件:#include 2)一个保护临界区代码的错误实例:(sigprocmask()和pause()...

Unix环境高级编程(阅读笔记)----sigsuspend函数

更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。 1)头文件:#include 2)一个保护临界区代码的错误实例:(sig...

竞态条件与sigsuspend函数(四)

****************************************************************************************************...
  • ZDF0414
  • ZDF0414
  • 2016年03月31日 14:27
  • 255

linux系统编程之信号(六):竞态条件与sigsuspend函数

一、利用pause和alarm函数实现sleep函数 #include int pause(void); pause函数使调用进程挂起直到有信号递达。如果信号的处理动作是终止进程,则进程终止,pau...

《UNIX环境高级编程》笔记--sigsuspend函数

更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。 如果希望对一个信号解除阻塞,然后pause等待以前被阻塞的信号发生,将如何呢?假定信号...
  • TODD911
  • TODD911
  • 2013年12月15日 10:25
  • 3801
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10 对sigprocmask,sleep 函数的理解(sigsuspend)
举报原因:
原因补充:

(最多只允许输入30个字)