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

ppt模板怎么做 下载网站沧州网站域名注册服务公司

ppt模板怎么做 下载网站,沧州网站域名注册服务公司,做企业官网用什么语言,做尽调需要用到的网站信号处理函数可以正常返回#xff0c;也可以调用其他函数返回到程序的主函数中#xff0c;而不是从处理程序返回。 setjmp/longjmp 使用longjmp可以跳转到setjmp设置的位置 这两个函数原型如下 #includesetjmp.h int setjmp(jmp_buf env); void longjmp(jmp_buf …信号处理函数可以正常返回也可以调用其他函数返回到程序的主函数中而不是从处理程序返回。 setjmp/longjmp 使用longjmp可以跳转到setjmp设置的位置 这两个函数原型如下 #includesetjmp.h int setjmp(jmp_buf env); void longjmp(jmp_buf env,int val); 参数env是一个特殊类型jmp_buf 的变量。这一数据类型是某种形式的数组其中存放的是在调用longjmp时能用来恢复栈状态的所有信息。一般来说env是个全局变量因为需从另一个函数中引用它。我们可以在希望返回的位置使用setjmp,直接调用setjmp时返回0;当从longjmp返回时setjmp的返回值是longjmp的第2个参数的值可以利用这一点使多个longjmp返回到一个setjmp处。 示例程序1 演示这两个函数的用法 #includestdio.h #includeunistd.h #includesignal.h #includesetjmp.h jmp_buf env;//保存待跳转位置的栈信息 void handler_sigrtmin(int signo){printf(recv SIGRTMIN\n);longjmp(env,1);//返回到env处第二个参数是1 } void handler_sigrtminplus1(int signo){printf(recv sigrtmin1\n);longjmp(env,2); } int main(){printf(pid:%d\n,getpid());//打印出本进程的id方便之后使用//设置返回点switch (setjmp(env)){case 0:break;case 1:printf(return from SIGRTMIN\n);break;case 2:printf(return from SIGRTMIN1\n);break;default:break;}signal(SIGRTMIN,handler_sigrtmin);signal(SIGRTMIN1,handler_sigrtminplus1);while (1);return 0; } 程序在main函数内调用setjmp设置了返回点。信号处理函数内部打印出提示信息后没有正常返回而是调用longjmp直接跨函数跳转返回到setjmp处。 执行程序时在一个终端执行本程序在另一个终端用kill命令发送信号 首先打印出pid之后我们打开另一个终端往程序发信号 再回去看看 结果符合预期。 但是就没有问题了吗我们继续用kill发送同样的信号 我们用kill连续发三个同样的信号 但是程序里只响应了一次 这是为什么呢?正如我们在《Linux C编程实战》笔记信号的捕捉和处理-CSDN博客所介绍的信号处理时会自动阻塞正在被处理的信号在信号处理函数返回时把进程的信号屏蔽字恢复即解除对当前信号的阻塞。示例程序没有让信号处理函数正常返回而是使用longjmp直接跳转所以进程的信号屏蔽字在第一次收到信号后 就把信号设置为阻塞并且再也没有恢复因而再也触发不了信号处理函数了除非手动将进程对信号的屏蔽去除。如果既想使用跨函数跳转直接返回又想避免每次都手动清除信号屏蔽的麻烦就要使用下面的函数了。 sigsetjmp/siglongjmp 为了解决信号被屏蔽的问题可以用下面两个函数来解决问题 #includesetjmp.h int sigsetjmp(sigjmp_buf env,int savesigs); void siglongjmp(sigjmp_buf env,int val); 这两个函数和之前的函数的唯一区别就是sigsetjmp多了一个参数savesigs如果savesigs非0则sigsetjmp在env中保存进程的当前信号屏蔽字在调用siglongjmp时会从其中恢复保存的信号屏蔽字。 示例程序2 #includestdio.h #includeunistd.h #includesignal.h #includesetjmp.h #define ENV_UNSAVE 0 #define ENV_SAVED 1 int flag_saveenvENV_UNSAVE; sigjmp_buf env; void handler_sigrtmin(int signo){if(flag_saveenvENV_UNSAVE)return;printf(recv SIGRTMIN\n);sleep(10);printf(in handler_sigrtmin,after sleep);siglongjmp(env,1); } int main(){printf(pid:%d\n,getpid());switch (sigsetjmp(env,1))//第二个参数只要不是0就可以{case 0:printf(return 0\n);flag_saveenvENV_SAVED;break;case 1:printf(return from SIGRTMIN\n);break;default:printf(return else\n);break;}signal(SIGRTMIN,handler_sigrtmin);while (1);return 0; } 本程序的信号处理函数先检查flag_saveenv的值是否为ENV_UNSAVE,如果是则直接返回因为此时程序还没来得及保存返回点的栈状态信息。在sigsetjmp 之后才将flag_ saveenv设置为ENV_ SAVED。如果不这样处理那么当信号发生在调用sigsetjmp之前时信号处理函数将返回到未知地点或程序崩溃(感兴趣的读者可以在sigsetjmp前面加上sleep (20),可以观察到程序崩溃)。使用siglongjmp从信号处理程序返回时都应该这样处理。 这是书上所说的我感觉书上说的情况可能代码是signal放在sigsetjmp之前这样可能没执行sigsetjmp就有信号发生示例的代码是先执行sigsetjmp再绑定的信号处理函数不会发生上面所说的情况 执行流程如图
http://www.zqtcl.cn/news/646234/

相关文章:

  • 河南周口东宇网站建设wordpress怎么重新安装插件
  • wordpress无法上传主题南通做网站优化公司
  • 做彩票网站能挣到钱吗南充市房产信息网
  • 沧州北京网站建设金华网站建设哪个公司好点
  • 北京朝阳建站优化wordpress主题访问慢
  • wordpress最快仿站酷炫个人特别网站
  • 公司建站详细步骤如何注册一家公司要多少钱
  • 网站推广网络营销山西大学物理电子工程学院研招网
  • 亚马逊做国际外贸在哪个网站毕业设计网站开发选题依据
  • 镇江网站排名优化费用app软件开发平台游戏
  • 襄阳网站建设xytzg南通网站建设top
  • 有没有做产品团购的网站2d动画制作软件
  • 成都网站排名生客seo杭州专业网站制作设计
  • 阿里云 企业 网站四平市网站建设
  • 政务门户网站建设信息奇人网站
  • 打开网站弹出广告代码如何建设网站方便后期维护
  • 海淀网站建设龙岩做网站用什么cms 知乎
  • 网站托管费用多少免费一卡二卡三
  • 长沙做网站品牌中信建设官网站首页
  • 网站空白页黑链聊城网站建设代理商
  • 微信上打开连接的网站怎么做在网上可以做宣传的有那些网站
  • 公司在选择网站时应考虑什么问题溧阳 招网站开发
  • 兴宁电子商务网站建设农村电子商务网站建设方案
  • 张北县网站建设网站设计师加油站
  • 网站建设车成本网站开发网络结构图
  • 建设部职称网站宝山网站制作
  • 太仓网站建设哪家好58同城找工作
  • 一键网站制作机关网站建设建议
  • 快站公众号工具台州网站制作系统分析怎么写
  • 品牌网站制作方案如何写推广软文