sigprocmask -- 5




概述在 linux 下,使用 alarm 和 signal 或 sigsuspend 可以实现系统的 sleep 功能,可以参看:sleep 函数的实现 但是如果使用 setittimer 与 sigsuspend 可以实现精度较高的定时功能函数原型int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); 定义于 sys/time.h 中调用成功返回 0 否则返回 -1参数说明which定时器类型参数定时器类型选项取值说明到时发送信号ITIMER_REAL以系统真实时间计算SIGALRMITIMER_VIRTUAL以进程在用户态下花费的时间来计算SIGALRMITIMER_PROF以进程在用户态和内核态下所花费的时间来计算SIGPROFvaluevalue 是一个 itimerval 结构的类型itimerval 结构如下:struct itimerval { struct timeval it_interval; struc
#linux    #unix    #龙潭书斋    #apue   
守护过程接下来,master 进程就要正式开始发挥他作为一个 daemon 进程的责任了,陷入循环,等待信号发生,做出相应处理ngx_new_binary = 0; delay = 0; sigio = 0; live = 1; for ( ;; ) { // 设定定时器,worker 定时退出 if (delay) { if (ngx_sigalrm) { sigio = 0; delay *= 2; ngx_sigalrm = 0; } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "termination cycle: %d", delay); itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 0; itv.it_value.tv_sec = delay / 1000; itv.it_value.tv_usec = (delay % 1000 ) * 1000; // 设定精确的定时功能,以系统时间计算 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { ngx_log_erro
#技术帖    #network    #龙潭书斋    #进程   
在信号的发送与捕捉中,我们对 sleep 函数进行了实现,但是最终,我们的实现仍有问题,那就是在处理我们的 SIGALRM 信号的过程中,如果开始执行其他的信号,之后回到我们的信号处理函数,然后做函数间跳转,进程行为会不可靠  sleep 函数unsigned int sleep(unsigned int seconds); 定义于 unistd.h 中返回未休眠够的秒数 执行 sleep 后进程被挂起,直到满足下列条件之一:已经过了 seconds 的秒数调用进程捕捉到一个信号并从信号处理程序返回 POSIX 的实现static void sig_alrm(int signo) { /* do nothing*/ } unsigned int sleep(unsigned int nsecs) { struct sigaction newact, oldact; sigset_t newmask, oldmask, suspmask; unsigned int unslept; newact.sa_handler = sig_alrm; sigemtyset(&newact.sa_mask); newact.sa_flags = 0
#读书笔记    #技术帖    #linux    #unix   

200x200


检测更改信号屏蔽字 -- sigprocmask 函数调用 sigprocmask 函数可以检测或更改进程的信号屏蔽字int sigprocmask(

#读书笔记    #技术帖    #linux    #unix   
信号的产生、阻塞和递送当引发信号的时间发生时,内核向进程发送一个信号,事件可以是硬件异常(如除以0)、软件条件(如alarm计时器超时)、终端产生的信号或调用kill函数产生的信号信号产生时,内核通常在进程表中设置一个某种形式的标志,这一动作,我们称之为“向进程递送了一个信号”,信号产生和递送之间,称信号是“未决的”进程可以选用信号递送阻塞,如果为进程产生了一个选择为阻塞的信号,而且对该信号的动作是系统默认动作或捕捉该信号,则为该进程将此信号保持未决状态,知道进程对此信号解除阻塞,或将此信号的动作改为忽略需要注意的是,内核是在递送信号的时候决定信号的动作的,而不是在信号产生时,因此进程可以在信号递送给他之前改变信号的动作通过调用 sigpending 函数可以判定哪些信号被设置为阻塞并处于未决状态在进程解除对某个信号的阻塞之前,大多数UNIX实现不允许系统递送该信号多次,相同信号只会递送一次信号屏蔽字每个进程都有一个信号屏蔽字,规定了当前要阻塞递送到进程的信号集,每种可能的信号,该屏蔽字中都有一位与之对应,进程可以调用 sigprocmask 函数来检测和更改其当前信号屏蔽字 
#读书笔记    #技术帖    #linux    #unix   



京ICP备15018585号