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


理解操作系统的sleep函数

写的很形象,分享一下 http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread.Sleep 函数来...
  • chinaclock
  • chinaclock
  • 2015年09月24日 16:14
  • 3117

VC++ Sleep函数原理及Sleep(0)的使用(文章较深入但通俗易懂)

我们可能经常会用到 Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2012-12-16 3:37:40,如果我调用一下 Thre...
  • chinaeran
  • chinaeran
  • 2013年10月15日 17:38
  • 3284

关于MySQL的SLEEP(N)函数

都知道通过在MySQL中执行select sleep(N)可以让此语句运行N秒钟: mysql> select sleep(1); +----------+ | sleep(1) | +-------...
  • zyz511919766
  • zyz511919766
  • 2014年12月29日 17:58
  • 23820

sigprocmask , sigpending 和 sigsuspend函数

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

sigsuspend sigprocmask函数的使用方法

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

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

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

sigprocmask和sigsuspend转

有2个函数 sigprocmask和sigsuspendsigprocmask系统调用用于改变当前阻塞信号集,比如进程想阻塞SIGMIN+1信号。就把这个信号加入掩码中,然后调用 sigprocmas...
  • michael1112
  • michael1112
  • 2011年06月03日 13:40
  • 966

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

#include #include #include #include #include #include void sig_int(int); int main(int arg...
  • yu_xiang
  • yu_xiang
  • 2011年11月23日 13:29
  • 1590

Linux sigsuspend与sigprocmask使用详解

1.sigsuspend()函数作用详解 一个错误示例: 参考APUE中的代码: 1)头文件:#include 2)一个保护临界区代码的错误实例:(sigprocmask()和pause()...
  • caoli98033
  • caoli98033
  • 2015年03月24日 13:19
  • 1302

APUE 程序清单10-11 信号设置和sigprocmask实例

#include "apue.h" #include "my_err.h" static void sig_quit(int); int main(void) { sigset_t newmask...
  • u012535146
  • u012535146
  • 2013年12月26日 15:32
  • 579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:10 对sigprocmask,sleep 函数的理解(sigsuspend)
举报原因:
原因补充:

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