当前位置: 首页 > news >正文

网络科技网站建设网站的内部优化

网络科技网站建设,网站的内部优化,广告公司宣传语,企业门户网站平台建设招标采购文件原理就是先使用定时器定时#xff0c;然后再使用pause函数或者sigsuspend函数主动阻塞挂起#xff0c;最终恢复现场。 如果使用pause函数的话#xff0c;优点是使用简单#xff0c;缺点是有可能产生时序竞态#xff0c;导致进程一直阻塞下去#xff1a;在定时和挂起之间…原理就是先使用定时器定时然后再使用pause函数或者sigsuspend函数主动阻塞挂起最终恢复现场。 如果使用pause函数的话优点是使用简单缺点是有可能产生时序竞态导致进程一直阻塞下去在定时和挂起之间有一个缝隙有可能定时后因为其他原因没有直接挂起而是被动挂起或者处理其他信号但这段时间时钟还在继续计时当时间到了以后信号就被发送等回来主动挂起的时候再也等不到那个信号了因此进程就会被一直挂起。为了解决这个问题我们在定时前先将SIGALRM信号屏蔽然后定时、挂起在挂起的同时我们解除对SIGALRM的屏蔽这样就不用担心主动挂起前错过信号了最后恢复现场。 可以根据代码理解一下其实是一个很符合直觉的过程。需要注意的是pause和sigsuspend只有失败返回值-1不过这个失败的意思是挂起失败也就是恢复运行从这个意义上来讲应该是成功返回值因此我们不要对-1返回值做处理我顺手处理了然后一直出错检查了半天。 代码如下 Utils.h里面是一些我封装的函数为了简化代码 // // Created by edward on 2021/5/7. //#ifndef LINUX_UTILS_H #define LINUX_UTILS_H#include string #include initializer_list #include signal.h/*!* 检查系统调用返回值* param x 返回值* param msg 错误提示语句* param y 错误状态默认为-1*/ void check_error(int x, const std::string msg error, int y -1); /*!* 清零mask并将il中的信号加入到mask中* param mask* param il*/ void add2mask(sigset_t *mask, std::initializer_listint il); /*!* 将il中的信号从mask中删除* param mask* param il*/ void del2mask(sigset_t *mask, std::initializer_listint il);#endif //LINUX_UTILS_H mysleep函数 2021.05.11更新修复了传入参数为0或者负数的bug。如果传入参数都是0的话将导致进程进入阻塞状态无法被唤醒 struct itimerval my_sleep(int seconds, int microseconds) {if (seconds 0 microseconds 0)return {0, 0}; //注册SIGALRM信号捕捉函数struct sigaction act, oldact;act.sa_handler alrm_handler;act.sa_flags 0;sigset_t mask, oldmask,suspendmask;sigemptyset(mask); //屏蔽键盘信号add2mask(mask, {SIGINT, SIGQUIT, SIGTSTP});act.sa_mask mask;check_error(sigaction(SIGALRM, act, oldact), sigaction error);//屏蔽alarm信号add2mask(mask, {SIGALRM});check_error(sigprocmask(SIG_BLOCK, mask, oldmask), sigprocmask error);//设置定时器struct itimerval new_value, old_value;new_value.it_value {seconds, microseconds};new_value.it_interval {0, 0};check_error(setitimer(ITIMER_REAL, new_value, old_value), setitimer error);//主动阻塞挂起等待被信号唤醒//pause(); //使用pause会产生竞态导致信号失效最终导致进程无限制挂起//通过首先将信号屏蔽防止信号失效然后再使用sigpending函数在挂起期间解除对ALRM信号的屏蔽使得进程最终能够被唤醒//在挂起时解除屏蔽alarm信号suspendmask oldmask;del2mask(suspendmask, {SIGALRM});sigsuspend(suspendmask);//恢复现场//恢复SIGALRM信号捕获函数check_error(sigaction(SIGALRM, oldact, nullptr), sigaction error);//重置定时器check_error(getitimer(ITIMER_REAL, new_value)); //获取剩余定时时间old_value.it_interval {0, 0};old_value.it_value {0, 0};check_error(setitimer(ITIMER_REAL, old_value, nullptr), setitimer error);//解除对ALRM信号的屏蔽add2mask(mask, {SIGALRM});check_error(sigprocmask(SIG_UNBLOCK, mask, nullptr), sigprocmask error);return new_value; //返回剩余定时时间 } Utils.cpp工具类实现非常简单 // // Created by edward on 2021/5/7. //#include utils.husing std::string;void check_error(int x, const string msg, int y) {if (x y) {perror(msg.c_str());exit(1);} }void add2mask(sigset_t *mask, std::initializer_listint il) {check_error(sigemptyset(mask), sigemptyset error);for (auto signum : il) {check_error(sigaddset(mask, signum), sigaddset error);} }void del2mask(sigset_t *mask, std::initializer_listint il) {for (auto signum : il) {check_error(sigdelset(mask, signum), sigdelset error);} }
http://www.zqtcl.cn/news/364509/

相关文章:

  • 北京一家专门做会所的网站基于ssh框架的网站开发流程
  • 可以在自己的电脑上做网站吗陕西商城网站建设
  • 深圳网站建设工作室郴州有什么好玩的地方
  • 用dw做的网站怎么发到网上竹妃怎么在公众号里做网站
  • 杭州网站优化搜索黑龙江公共资源交易网官网
  • 动易网站 首页模板修改平台网站是什么
  • 营销网站更受用户欢迎的原因是英文网站的建设意义
  • 学网站建设基础河北省建设网站的网站首页
  • 铜仁市住房和城乡建设部网站延边有没有做网站的
  • 如何做ppt的模板下载网站移动端网站的优点
  • 网站域名没有实名认证微信平台开发技术
  • 自己用电脑做虚拟机怎么建网站个人网站 icp 代理
  • 嘉兴网站建设999 999中国建设招标网是私人网站吗
  • 网站程序设置主页面零基础学wordpress pdf下载
  • 网站代码优化有哪些专做立体化的网站
  • 单县网站定制培训机构专业
  • 网站防红链接怎么做网站建设中提示页面
  • 网站开发和游戏开发的区别互联网服务平台投诉
  • 杭州定制网站公司出名的设计网站
  • 网站查询访问注册电气工程师考试
  • 北京企业网站推广哪家公司好电商平台代运营
  • 北京快速建站模板信息管理系统网站开发
  • 做网站后台需要写代码吗做网站收多少钱
  • 企业手机网站建设咨询为企业设计一个网站
  • 做网站平台成本珠海自适应网站设计
  • 做网站手机端需要pc端的源代码吗经营网站需要注意什么
  • 域名购买之后怎么做网站做+淘宝客最大的网站是叫什么
  • 在线营销型网站wordpress 怎么添加即时联系窗口
  • 网站加图标网站开发属于无形资产
  • 个人网站开发与设计摘要企业营销策划心得体会