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

网页游戏网站电影网站开发报价明细表

网页游戏网站电影,网站开发报价明细表,厦门网站设计多少钱,什么是网络营销网络营销的内容有哪些目录 前言 一、进程终止 1、进程终止的几种可能 2、exit 与 _exit 二、进程等待 1、为什么要进程等待 2、如何进行进程等待 #xff08;1#xff09;wait函数 #xff08;2#xff09;waitpid函数 3、再次深刻理解进程等待 前言 我们前面介绍进程时说子进程退出…目录 前言 一、进程终止 1、进程终止的几种可能  2、exit 与 _exit 二、进程等待 1、为什么要进程等待 2、如何进行进程等待 1wait函数  2waitpid函数 3、再次深刻理解进程等待 前言 我们前面介绍进程时说子进程退出父进程不对子进程进行资源回收子进程会进入僵尸状态对于操作系统来说这是一种资源泄漏而且还是操作系统层面的资源泄漏除非父进程退出否则子进程将一直处于僵尸状态本章就介绍父进程如何回收子进程 一、进程终止 1、进程终止的几种可能  在介绍回收子进程之前我们必须对进程终止有一定的了解所谓进程终止就是进程的退出这里我们首先要直到进程退出有以下三种可能 1、程序正常运行结束结果正确 2、程序正常运行结束结果不正确 3、程序崩溃结果不重要 可能我们之前对进程退出并没有什么概念我们是如何区分以上三种情况呢比如我们以前在virtual studio上运行我们的C/C程序我们总会写一个main函数而一般我们都会在main函数的最后写一个return 0实际上这个0就是退出码我们通过这个判定结果是否正确退出码有对应的解释含义我们可以通过 strerror 函数将退出码含义打印出来这是区分情况一和情况二的方法对于情况三程序崩溃我们的软件 virtual studio 一般会出来一个弹窗告诉你是哪里引发了程序的崩溃最常见的就是除零错误、空指针解引用等等都会导致程序崩溃下面我们来打印退出码如下代码 我们编译运行上述程序结果如下 我们发现错误码的信息最多编辑到了133号前面几项我们也很熟悉其中第一项0就是成功且结果正确 2、exit 与 _exit 前面我们说过在main函数中我们可以通过return语句让进程退出并返回返回值那么要是我们不在main函数呢那么我们难道要返回main函数再调用return语句那也太麻烦了吧实际上我们也可以通过exit函数和 _ exit函数来使进程终止如下代码 我们编译代码结果如下所示这里介绍一条命令 echo $?可以查看最近运行的一个程序的返回值我们发现我们输入除-1以外的值时返回值为0也就是main函数中的return 语句而我们输入-1时返回值为14是我们调用exit函数的返回值 上述的退出函数exit换成_exit也可以实现相同功能那么其区别在哪呢看如下代码 当我们使用exit函数后运行结果如下 当我们使用_exit函数后运行结果如下 我们已经看不到you can see me这是因为我们的打印的内容还在C语言的缓冲区内而我们的_exit是系统调用在退出前并不能刷新缓冲区而我们的exit为C语言库函数会刷新我们的缓冲区 补充C语言的缓冲区刷新机制为行刷新因为在打印时没有换行符所以我们的使用exit函数时会打印而使用_exit函数时不会打印 二、进程等待 1、为什么要进程等待 其一这个原因早在我们前面就已经进行了阐述当子进程退出时父进程不对子进程进行资源回收子进程将一直处于僵尸状态而这种状态会造成系统资源泄漏这时我们需要通过进程等待的方式给子进程 “收尸”         其二我们让子进程去完成任务是否需要子进程完成的如何对于某些时候就有这样的需求因此进程等待另一作用是获取子进程任务完成情况 2、如何进行进程等待 1wait函数  关于如何进行进程等待我们通常是通过系统调用wait和waitpid来实现我们首先看啊可能wait的函数声明 这个函数只有一个参数是一个输出型参数所谓输出型参数就是我们传一个指针函数内会给这个指针执行的值进行赋值返还给我们这个输出型参数就是子进程的退出码和终止信号这里我们暂时设置为NULL等待会介绍waitpid时再做介绍         该函数的返回值若调用成功返回子进程pid若失败返回-1.错误码被设置我们写出如下代码查看父进程是否回收了子进程 #include stdio.h #include string.h #include stdlib.h #include unistd.h #include sys/wait.h #include sys/types.hint main() {int id fork();if(id -1){// fork调用失败exit(1);}else if(id 0){// 子进程int cnt 5;while(cnt--){printf(我是子进程我的pid:%d,ppid:%d\n, getpid(), getppid());sleep(1);}exit(14); // 退出码}else {// 父进程sleep(7);wait(NULL); // 进程等待sleep(2);}return 0; } 我们再在命令行输入以下脚本命令对这两个进程进行监控 while :; do ps -axj | head -1 ps -axj | grep test | grep -v grep; sleep 1; echo -------------------; done 我们发现前面几秒确实都在运行接着中间有两秒子进程处于僵尸状态因为父进程比子进程多sleep两秒正如我们所料接着最后只剩父进程子进程成功被父进程回收 2waitpid函数 下面为我们通过man手册查询结果 参数pid pid作用pid -1等待进程组号为pid绝对值的任何子进程。pid -1等待任何子进程此时的waitpid()函数就退化成了普通的wait()函数。pid 0等待进程组号与目前进程相同的任何子进程也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。pid 0等待进程号为pid的子进程。 注意这里进程组号的暂不提及我们用的也不多平常用的较多的就是2和4 参数status 这个参数为输出型参数与我们wait函数相同关于这个参数的使用我们不能将里面的int值整体使用得按比特位分开使用 情况一正常退出 此时我们使用第7到第15比特位当作退出码我们可以通过 (status 8) 0xFF来获得这个退出码还可以使用宏函数 WEXITSTATUS 来获取通过宏函数 WIFEXITED 来获取进程是否正常退出若正常退出返回真否则返回假  情况二信号终止退出异常退出 这里我们用后面0到6的比特位来表示信号终止我们可以使用 status  0x7F来得到这个终止信号至于这里的 core dump 标志位暂不讲解这又是另一个话题了 参数options 这个参数默认填0就好表示阻塞等待若填WNOHANG则表示非阻塞等待 返回值 waitpid的返回值略比wait复杂一些有三种情况 1、正常返回此时返回子进程pid 2、若设置WNOHANG且子进程还未退出则返回0子进程退出了返回子进程pid 3、调用失败返回-1错误码被设置 代码实践 #include stdio.h #include string.h #include stdlib.h #include unistd.h #include sys/wait.h #include sys/types.hint main() {int id fork();if(id -1){// fork调用失败exit(1);}else if(id 0){// 子进程int cnt 5;while(cnt--){printf(我是子进程我的pid:%d,ppid:%d\n, getpid(), getppid());sleep(1);}exit(14); // 退出码}else {// 父进程sleep(7);int status 0;// 进程等待int ret waitpid(id, status, 0); // 此时与我们的wait函数功能相同if(WIFEXITED(status)){printf(子进程正常退出退出码为%d\n, WEXITSTATUS(status));}else{printf(子进程异常退出收到信号%d\n, (status) 0x7F);}sleep(2);}return 0; }代码输出结果如下 若我们将代码加上一个除零错误 运行结果如下 我们再通过kill -l查看信号8号信号正是我们的浮点数计算问题 我们再将代码改一下将我们的waitpid改成非阻塞等待的情况如下 #include stdio.h #include stdbool.h #include string.h #include stdlib.h #include unistd.h #include sys/wait.h #include sys/types.hint main() {int id fork();if(id -1){// fork调用失败exit(1);}else if(id 0){// 子进程int cnt 5;// 除零错误展示// int a 10/ 0;while(cnt--){printf(我是子进程我的pid:%d,ppid:%d\n, getpid(), getppid());sleep(1);}exit(14); // 退出码}else {// 父进程int status 0;// 进程等待while(true){int ret waitpid(id, status, WNOHANG); if(ret -1){printf(waitpid调用失败\n);exit(-1);}else if(ret 0){printf(子进程还未退出我再干点别的\n);sleep(1);}else{printf(等待成功\n);break;}}if(WIFEXITED(status)){printf(子进程正常退出退出码为%d\n, WEXITSTATUS(status));}else{printf(子进程异常退出收到信号%d\n, (status) 0x7F);}sleep(2);}return 0; }运行结果如下此时我们的父进程就不用阻塞等待子进程结束了父进程只需要通过轮询的方式来来回收子进程 3、再次深刻理解进程等待 上述内容为进程等待的实操部分我们现在再次回到理论部分我有如下问题 问题一我们是否可以通过一个全局变量来获取子进程的退出码呢         不可以虽然父进程和子进程共用一段代码但是都有各自的进程地址空间当我们使用全局变量时子进程往这个全局变量里写入时会发生写时拷贝因此无法获得退出码这也是进程的独立性 问题二既然进程具有独立性那么wait和waitpid是如何获取子进程的退出码的呢         我们的wait和waitpid属于系统调用既然是系统调用当然是属于操作系统的一部分我们在回收子进程时实际上是销毁进程PCB等内核数据的过程而PCBtask_struct中有一个退出码和退出信号的字段以下为Linux源码截图 我们在task_struct里确实发现了这几个字段如果有兴趣的可以去官网下载一份源码task_strcut结构体在 include/linux/sche.h 中         回到正题既然我们task_struct中有这些字段那么我们父进程回收子进程的时候是否可以获取这些字段的信息呢答案当然是肯定的我们的wait和waitpid为系统调用当然有资格获取这些字段我们的父进程也就可以通过这两个系统调用拿到了子进程的退出码了
http://www.yutouwan.com/news/447504/

相关文章:

  • 网站开发网校网站改版 百度
  • 网站正在建设中 模版wordpress资源
  • 做网盟行业网站的图片广告的销售wordpress下载数据库文件
  • 北京网站制作建设公司哪家好在线设计免费签名
  • 合肥网站建设讯息建筑模板厂
  • 珠海免费网站建设新北做网站
  • 专业建设网站公司排名西安哪家网站建设好
  • 海口网站建设哪家好广告点击量多少钱一个点击
  • 获取网站访客qq号码wordpress登录地址插件
  • 手机网站开发软件有哪些网站做二级目录跟二级域名的区别
  • 社区子网站群建设百度会收录双域名的网站么
  • 成都建设企业网站乔拓云h5制作
  • 免费建立小程序网站建筑设计人才招聘网站
  • 手把手教 个人网站开发卖东西的网站模板免费下载
  • 旅行社网站怎么做seo优化软件oem
  • 广州模板网站建设价格长春行业网站
  • 网站模板漏洞北京装饰公司招聘信息
  • 在印尼用哪个网站做电商微信h5页面制作模板
  • 怎样做网站赚钱医疗ppt模板下载免费完整版
  • 网站怎么让百度收录一张图做封面网站建设合同示范文本
  • html5网站建设加盟如何备份网站数据
  • 百度快照网站怎么做加强网站的建设与管理
  • 北京企业网站改版开鲁网站seo转接
  • 网页制作与网站建设实战大全pdf【郑州网站建设】
  • 阿里网站备案寄材料百度怎么优化网站排名
  • 网站手机端制作软件免费的网站管理系统
  • 建设彩票网站如何盈利建网站需要哪些资质
  • 模具 东莞网站建设如何不花钱开发网站
  • 一级a做爰网站中铁建设集团招聘信息
  • 图片外链上传网站济宁祥云网站建设