岳阳新网网站建设有限公司,wordpress作品展示,如何开发小程序?,上海网站开发平台pause函数 调用该函数可以造成进程主动挂起#xff0c;等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值#xff1a;-1 并设置errno为EINTR 返回值#xff1a; ① 如果信号的默认处理动作是终止进程#… pause函数 调用该函数可以造成进程主动挂起等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值-1 并设置errno为EINTR 返回值 ① 如果信号的默认处理动作是终止进程则进程终止pause函数么有机会返回。 ② 如果信号的默认处理动作是忽略进程继续处于挂起状态pause函数不返回。 ③ 如果信号的处理动作是捕捉则【调用完信号处理函数之后pause返回-1】 errno设置为EINTR表示“被信号中断”。想想我们还有哪个函数只有出错返回值。 ④ pause收到的信号不能被屏蔽如果被屏蔽那么pause就不能被唤醒。 pause可以和alarm一起实现sleep函数功能 #include stdio.h
#include unistd.h
#include stdlib.h
#include signal.hvoid catch_sigalrm(int signo)
{;
}unsigned int mysleep(unsigned int seconds)
{int ret;struct sigaction act, oldact;act.as_handler catch_sigalrm;sigemptyset(act.sa_mask); //设置屏蔽字act.sa_flags 0;ret sigaction(SIGALRM, act, oldact);if(ret -1){perror(sigaction error);exit(1);}alarm(seconds);ret pause(); //主动挂起 等信号if(ret -1 errno EINTR){printf(pause sucess);}ret alarm(0); //重置alarmsigaction(SIGALRM, oldact, NULL);return ret;
} 时序竞态 设想如下场景 欲睡觉定闹钟10分钟希望10分钟后闹铃将自己唤醒。 正常定时睡觉10分钟后被闹钟唤醒。 异常闹钟定好后被唤走外出劳动20分钟后劳动结束。回来继续睡觉计划但劳动期间闹钟已经响过不会再将我唤醒。 解决时序问题 可以通过设置屏蔽SIGALRM的方法来控制程序执行逻辑但无论如何设置程序都有可能在“解除信号屏蔽”与“挂起等待信号”这个两个操作间隙失去cpu资源。除非将这两步骤合并成一个“原子操作”。sigsuspend函数具备这个功能。在对时序要求严格的场合下都应该使用sigsuspend替换pause。 int sigsuspend(const sigset_t *mask); 挂起等待信号。 sigsuspend函数调用期间进程信号屏蔽字由其参数mask指定。 可将某个信号如SIGALRM从临时信号屏蔽字mask中删除这样在调用sigsuspend时将解除对该信号的屏蔽然后挂起等待当sigsuspend返回时进程的信号屏蔽字恢复为原来的值。如果原来对该信号是屏蔽态sigsuspend函数返回后仍然屏蔽该信号。 修改如下; ......//设置阻塞信号集阻塞SIGALRM信号sigset_t newmask, oldmask, suspmask;sigemptyset(newmask);sigaddset(newmask, SIGALRM);sigprocmask(SIG_BLOCK, newmask, oldmask); //信号屏蔽字maskalarm(seconds);//构造一个调用sigsuspend临时有效 阻塞信号集在临时阻塞信号集里解除SIGALRM的阻塞suspmask oldmask;sigdelset(suspmask, SIGALRM)//sigsuspend调用期间采用临时阻塞信号集suspamask替换原有阻塞信号集这个信号集中不包含SIGALRM信号同时挂起等待。当sigsuspend被信号唤醒返回时恢复原有的阻塞信号集sigsuspend(suspmask); ...... 转载于:https://www.cnblogs.com/lr1402585172/p/10554590.html