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

网站设计就业压力网站二级页面设计要求

网站设计就业压力,网站二级页面设计要求,正规电商平台,wordpress+tag小图标在之前的学习中#xff0c;我们知道我们的进程在运行结束的时候#xff0c;那么它并不会立即进入死亡状态#xff0c;而是先进入僵尸状态#xff0c;维持僵尸状态一段时间#xff0c;那么此时在僵尸状态中的进程#xff0c;那么它的内核数据已经移出内存被清理了#xf… 在之前的学习中我们知道我们的进程在运行结束的时候那么它并不会立即进入死亡状态而是先进入僵尸状态维持僵尸状态一段时间那么此时在僵尸状态中的进程那么它的内核数据已经移出内存被清理了但是该进程在操作系统内对应的task_struct结构体不会被立即被回收清理那么之所以不会被立即回收清理就是因为我们需要知道获取到进程是最后是怎么退出的而这个信息就被保存在我们该进程所对应的task_struct结构体当中那我们需要获取到进程退出的信息。 那么接下来我们对于进程的终止无非概括起来就有这三个疑问我们进程的终止的信息是什么保存在哪里以及我们要获取该进程的终止信息有什么用那么接下来我便围绕这三个问题展开我们的下文那么废话不多说就让我们进入正文部分的讲解 进程的终止 进程就和我们人类一样有着生命的开始与生命的结束那么对于进程来说那么我们进程一般是被用户创建来完成某项任务以及工作的那么一旦我们该进程执行完他所有的内容那么我们必须要知道它做的怎么样不可能该进程处理执行完它所有的代码然后结束之后我们就对它不管不问了就好比于你在单位上你每天工作完都需要向单位上的领导或者上级汇报你今天干了什么事情究竟是完成了领导交给我的任务还是没完成还是说我自己就摆烂不想做了那么这些事情领导都有权知道然后再进行相应的决策。 那么现在我们知道我们为什么要获取进程终止的信息了那么目的就是知道进程完成它的工作完成的怎么样那么接下来的问题就是我们如何查询我们进程的终止的信息呢 那么我们知道我们一个进程的上下文就在我们进程代码的main函数当中那么在大学的时候我们平常在写c语言或者c代码的时候都是公式的引个头文件然后写一个main函数然后return 0但是我们从来都没有思考过我们在main函数定义的return 0的作用是什么为什么要有return以及为return的为什么是0而不是1或者2等其他的数字 那么这个在main函数的return的内容那么它就是我们程序的退出码而退出码就反应了我们进程终止时的一个状态那么我们进程结束时退出一般有三种场景分别是 1: 执行完该进程所有的代码内容并且结果正确2: 执行完该进程所有的代码内容但结果不正确3: 进程在执行的途中出现异常没有执行完所有的代码然后退出了 那么对于这三种情况其实我们真正关心的只有第二和第三种情况就好比于小学时你考试考了90分考了全班第一名那么你爸根本不会对你有所过问更不会问你为什么考了90分但是如果说你考了13分并且还是全班倒数第一那么你爸肯定就要责问你为什么考了13分是什么原因导致的那么你得向你爸解释说到是因为状态不好还是说当天肚子不舒服导致的。 那么在刚才的例子中你考了13分或者倒数第一那么就类似于你的进程要么出现了第二种或者第三种情况那么究竟是为什么出现这个原因那么就需要退出码来进行解释那么我们的退出码的每一个值都有具体的含义那么退出码为0代表着进程执行完所有的代码内容并且结果正确而如果退出码为1或者2那么说明进程出现了相应的问题 那么在我们的Linux下也有相应的指令能够看到获取到最近一次结束的进程的退出码那么该指令也就是echo $? 那么输入该指令接着下一行就能够显示反馈最近一次结束进程的退出码 那么这里我们一定要注意我刚才所说的那第一个以及第二场景中关于结果是否正确的问题我觉得很多读者其实包括之前我在内都会误以为这个结果是我们代码层面上的逻辑出现的错误比如是我们要编写一个代码要实现两个数a和b相加结果代码写成了a和b相乘那么这是不是就意味着出现了我们上面所说的第二种场景也就是代码执行完了但是结果是错的呢这里我们注意这里的结果不是指的是我们所谓代码的逻辑层面上的结果因为操作系统它哪里能知道能检查我们写的代码想要完成什么想要干什么那么这里的结果是指的是语言或者说语法层面上的比如我们指针是否出现了野指针是否有越界访问等所以一定要注意理解 那么我们除了我们的退出码其实我们还有错误码的存在那么所谓的错误码就是我们调用我们的库函数出现失败或者异常那么此时我们调用库函数失败的错误信息会保存到我们的全局变量中errno当中那么如果我们还是正常执行完我们所有的代码那么我们的退出码是是0但是执行完所有的代码不代表我们的代码没出现任何错误如果有比如有库函数的调用失败发生那么我们可以通过错误码在我们的代码中定义一个检查逻辑看是否出现库函数的调用出错而我们的errno只记录最新一次库函数调用出错的错误码 我们可以接着借组perror函数能够将我们的错误码对应的含义转换为字符串perror函数会返回一个字符类型的指针那么这里注意我们的错误码不是我们的退出码我们检查该进程的退出状态的时候关心的是退出码而不是所谓的错误码 那么了解了我们的退出码等概念那么我们就可以在代码中定义相应的逻辑比如if else的逻辑判断我们代码如果出现了这样的错误的结果那么我们会进行怎么样的处理然后return一个非0的退出码那么这个非0的退出码的含义则是由我们用户自己来定义的 #include stdio.hint main() {FILE *file fopen(example.txt, r);if (file NULL) {printf(File not found.\n);return 1; // 文件不存在返回非零值}// 如果文件存在进行其他操作// ...fclose(file);printf(File found and processed.\n);return 0; // 成功完成所有操作返回0 }那么进程会专门记录进程的退出码以及异常的情况那么在我们进程所对应的task_struct结构体中会专门有两个字段分别是exit_code以及exit_signal来记录这两个内容所以这就是为什么我们进程在进入僵尸状态之后我们该进程对应的task_struct结构体不会被立即回收清理掉的原因因为得有进程来接收这两个字段的内容来获取该进程的退出情况。 进程的等待 那么前面详细的介绍我们进程的终止对应的退出码就为了给我们进程的等待做铺垫。 那么我们知道我们父进程在代码层面上可以调用我们的系统调用接口也就是fork函数来创建一个子进程那么我们知道我们父进程创建子进程的目的就是为了让子进程来帮组父进程来完成某项特定的任务或者工作就好比我们自己在写代码的时候我们代码所有的逻辑以及各种模块我们不会都全部定义在我们的main函数当中而是会自己定义一些函数来完成这个主函数特定的功能与模块在将处理后的结果返回给我们的主函数即可这样的好处就是功能模块化使得逻辑清晰便于管理。 同理我们的父进程创建子进程的思路和我们上面的函数的例子异曲同工就是父进程让子进程帮自己办点事那么我们可以通过一个循环来创建一批子进程然后根据fork函数的返回值让子进程有着自己的执行流然后我们可以用过一个函数来封装子进程的执行内容那么这就是我们一个刚才的模块化思想的简单应用 而在此过程中父进程要知道子进程完成的怎么样那么则是需要获取子进程的退出码等内容 那么我们就需要我们的系统调用接口这里有两个函数wait函数与waitpid函数来获取我们子进程的退出码等内容。 那么wait函数的功能是waitpid函数的子集所以我们一般使用waitpid函数要多一些那么我们的wait函数的参数是一个int类型的指针而这个参数的作用我在后文介绍waitpid的时候会进行讲解而wait的返回值则有3种分别是要么大于0或者等于0以及小于0. 那么大于0则代表我们等待的子进程结束那么我们这个返回值就是子进程的PID而小于0则是等待出错当我们等待的不是该父进程对应的子进程或者该父进程没有创建子进程那么就会返回一个小于0的返回值而返回值为0说明我们该父进程等待的子进程还没有运行结束而waitpid的返回值也是和wait函数是同样的内容 那么我们知道当我们的父进程调用了fork函数创建了子进程那么此时我们的父进程与子进程会有着不同的执行流那么当我们父进程执行到我们的wait函数语句的时候那么此时我们父进程不会执行wait函数之后的语句了而是一直卡在wait函数这里等待我们子进程的结束那么此时我们父进程的状态会从原来的R状态修改为S状态也就是阻塞等待状态。 那么在我们之前的学习中我们知道我们的S状态是因为我们该进程需要与我们的io设备交互此时要等待我们相应的io设备就绪有响应才能进行之后的代码比如我们在代码中调用了我们的printf函数需要向显示器做写入或者调用了scanf函数要获取用户键盘上的输入但是在这里我们知道调用wait函数那么如果等待的子进程还在运行那么此时我们的父进程也会陷入等待状态而进程对应的task_struct结构体中也有对应的一个指针指向该进程对应的等待队列那么此时该父进程就会被放到等待队列当中去 而对于waitPID来说那么它有三个参数 pid 指定要等待的子进程的PID。 可以是特定的子进程PID也可以是特殊值如-1等待任何子进程。 status 一个指向int类型的指针用于存储子进程的退出状态。 这个参数是一个输出型参数waitpid()会将子进程的退出状态保存在这里。 options 等待选项可以是0或其他标志的组合。 如果设置为0则表示采用阻塞式等待直到指定的子进程终止。 输出型参数也就是int类型的指针那么它则是带出我们子进程的退出码以及异常等信息而之前我们说过我们进程的结构体中专门有两个字段来记录该进程终止时的退出码以及异常状况那么此时我们的系统调用函数wait就可以获取到这两个字段然后通过位运算将其保存到传入的int类型的参数中那么我们知道我们一个int类型的数有32个二进制位那么此时我们这个数据的最低的8位则是用来表示进程的异常而接着的后8位则是用来表示进程的退出码那么同样我们可以通过我们的位运算来获取得到对应的内容但是我们Linux下专门定义了对应的宏可以用来专门来将其转换得到我们的子进程的退出码那么这个宏就是 WEXITSTATUS(status) 如果子进程正常终止则返回其退出码。 而对于option选项的话如果option是0的话那么意味着我们采取的是阻塞式等待我们的子进程的退出信息那么一旦我们该子进程还在运行那么我们就陷入等待 那么这里我的option也可以采取的是非阻塞式等待那么就需要我们设置为WONOHANG,那么WONOHANG是Linux控制waitpid函数行为的一个宏定义而这个选项就意味着我们都waitpid是采取非阻塞方式来等待 那么我还是举一个例子来理解我们阻塞式等待与非阻塞式等待的一个区别就好比你现在打电话查询你的考试信息那么阻塞式等待就是你在电话的那一头一直不挂着电话然后自己什么也不干就一直等待电话的另一头给你考试的信息而非阻塞式等待的话则是你先打一通电话来查询是否有结果如果没有结果那么就将电话给挂掉然后自己在玩会儿手机敢自己的事情然后过了一段时间再打电话进行查询重复这样的过程知道最终获取到信息。 所以我们的刚才例子中的第二种方式就是我们的非阻塞轮询的方式那么我们的父进程此时的状态不会被设置为S状态而是可以继续执行wait之后的代码然后时不时的在调用waitpid来进行查询那么这里就是通过我们的循环来实现那么这就是我们的非阻塞轮询的方式来等待相比于之前啥都不干那么非阻塞等待意味着父进程能够执行自己之后的代码显然这种方式要更高效一点 #include stdio.h #include stdlib.h #include sys/types.h #include sys/wait.h #include unistd.hint main() {pid_t pid fork();if (pid -1) {perror(fork);exit(EXIT_FAILURE);} else if (pid 0) {// 子进程printf(Child process is running...\n);sleep(5); // 模拟子进程执行一些任务printf(Child process is exiting with status 42\n);exit(42);} else {// 父进程int status;while (1) {pid_t child_pid waitpid(pid, status, WNOHANG);if (child_pid -1) {perror(waitpid);exit(EXIT_FAILURE);//EXIT_FAILURE是一个用于表示程序异常终止的宏}if (child_pid 0) {// 子进程尚未终止父进程可以继续执行其他任务printf(Child process is still running. Polling...\n);sleep(1); // 等待一段时间再继续轮询} else {// 子进程已终止if(WIFSIGNALED(status)0)printf(Child process exited with status %d\n, WEXITSTATUS(status));break; // 退出循环}}}return 0; }结语 那么这就是本篇文章的全部内容主要讲述了我们的进程的终止与等待那么我的下一篇文章将介绍进程的替换的内容那么我会持续更新希望你能够多多关注与支持那么如果本篇文章对你有所帮助的话那么还请多多三连加关注支持一下哦你的支持就是我最大的动力
http://www.w-s-a.com/news/197858/

相关文章:

  • 做一个网站的详细教学wordpress 忘记用户名密码
  • 建设银行的网站是多少wordpress添加新页面跳转
  • 网站设计费用抓取网站访客qq号码
  • 驾校视频网站模板郑州网站建设价格
  • 上海 有哪些做网站的公司成都企业网站备案流程
  • 移动端快速建站的方法青海公司网站建设
  • 网站重新搭建程序要多少钱移动互联网应用的使用情况
  • 学建站论坛给别人做网站怎么赚钱吗
  • 响应式网站代码校友会网站建设的目的
  • 北京公司网站网站建设html模板
  • 专门做医疗器械的网站免费网页制作系统团队
  • 网站开发技术 html临夏网站建设
  • flash网站模板免费下载拍卖网站开发多少钱
  • 北京网站建设制作颍州网站建设
  • 网站制作报价表做网站上海公司
  • 简洁大气蓝色文章资讯网站百度搜索广告推广
  • 河南建设工程协会网站网站收银系统建设
  • 网站制作 服务企业网站案例展示
  • 咸宁网站建设wordpress手动降级
  • 昆明做网站建设怎么样做网站赚钱全攻略
  • 企业网站建设实战教程微信如何注册小程序
  • 做一件代发网站百度seo服务
  • 小说网站开发 公司可以做行程的网站
  • 古交市网站建设公司apk连接wordpress
  • 网页 网 址网站区别wordpress菜单居右
  • 网站建设搭建运营一台云服务器做多个网站
  • 用php做网站用什么框架推广网站推荐
  • 如何用二级域名做网站多用户网上商城
  • 河南省建设科技网站浅谈电子商务网站建设与规划
  • 网站空间需要续费青海网站建设推广