sigsuspend -- 4




概述在 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   



京ICP备15018585号