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

php程序员网站开发建设外贸平台运营

php程序员网站开发建设,外贸平台运营,如何在app上做网站,中建八局第一建设公司网站在上一节利用fork实现服务端与多个客户端建立连接中#xff0c;我们使用fork函数来实现服务端既可以accept新的客户端连接请求#xff0c;又可以接收已连接上的客户端发来的消息。但在Linux中#xff0c;在子进程终止后#xff0c;父进程需要处理该子进程的终止状态#x…在上一节利用fork实现服务端与多个客户端建立连接中我们使用fork函数来实现服务端既可以accept新的客户端连接请求又可以接收已连接上的客户端发来的消息。但在Linux中在子进程终止后父进程需要处理该子进程的终止状态否则子进程将成为僵尸进程本节就来探讨一下僵尸进程的处理。 文章目录 1 什么是僵尸进程2 回收僵尸进程2.1 SIG_IGN忽略2.2 wait和waitpid2.2.1 wait2.2.1 waitpid 1 什么是僵尸进程 僵尸进程(Zombie Process)是操作系统中的一种特殊进程状态它通常出现在一个子进程终止但其父进程尚未能够处理该子进程的终止状态。 特点 僵尸进程不执行任何代码它们仅仅是一个进程描述符和一些状态信息如退出状态码占用少量系统资源。如果大量的僵尸进程积累可能会导致系统资源耗尽。 解决方法 当子进程终止时父进程可以使用wait()或waitpid()等系统调用来等待子进程的退出状态信息从而释放子进程的资源同时告知操作系统可以回收子进程的进程表项另一种方法是使用信号处理程序在父进程中注册SIGCHLD信号处理程序来处理子进程的退出状态 在上一篇文章的例子中如果在客户端的进程终止后服务端没有回收子进程的话将产生一个僵尸进程。 我们可以使用top指令来看系统中现在有多少个僵尸进程 我们还可以使用ps -aux |grep Z来查看具体的僵尸进程的信息 图中STAT(状态)为Z(Zombie)的即为僵尸进程。 2 回收僵尸进程 2.1 SIG_IGN忽略 最简单的我们可以使用SIG_IGN来忽略SIGCHLD信号这样内核会在子进程终止时立即将其资源释放而不需要父进程调用wait或waitpid来获取子进程的终止状态以释放资源。 可以看到此时是没有产生僵尸进程的 2.2 wait和waitpid 使用signal(SIGCHLD, SIG_IGN);的方式处理僵尸进程有一些局限性和潜在的问题 父进程无法得知子进程是正常退出还是异常终止以及子进程的退出状态是什么。父进程无法正确处理每个子进程的终止状态。 如果需要掌握子进程退出的情况建议注册信号回调函数然后使用wait或waitpid来处理僵尸进程。 2.2.1 wait 如下图所示可以使用wait函数来回收子进程的资源。 运行程序创建一个客户端然后关闭再创建一个客户端然后再关闭结果如下 可以看到服务端正常地回收了资源此时使用top查看也是没有僵尸进程的。 但是在多个客户端同时关闭的情况下wait会产生问题 我们现在对客户端的代码做出如下修改 现在来看一下这10个套接字同时退出后会发生什么 可以看到我们注册的SIGCHLD回调函数只被触发了4次也就是说只有4个子进程的资源被回收了。此时用top查看僵尸进程的数量果然还有6个 实际上也好理解这些套接字在非常短的时间间隔内同时关闭对于Linux的内核来看应该是有一个进程专门用来处理这些信号在上一个信号还在处理的同时又来了多个信号那么下次OS只会响应一个信号而不会调用多次回调函数然后调用一次wait就回收一个子进程。 所以如果我们多次测试可以发现每次被回收的进程的数量都是不同的这和OS内部的任务调度有关但基本上不可能10个全部回收。 那我们是否可以在sigchld_handler中调用while循环无限地wait来解决这个问题呢 答案是否定的。因为 wait 是一个阻塞调用会导致信号处理函数阻塞而信号处理函数的处理应该尽量迅速。 2.2.1 waitpid 这时我们就可以使用waitpid函数 pid_t waitpid(pid_t pid, int *status, int options);其中第三个参数options的常用值如下(可以使用按位或运算符|组合多个选项) WNOHANG在没有终止的子进程时立即返回不阻塞。如果指定了这个选项waitpid 将立即返回不会等待子进程终止。WUNTRACED也等待已停止的子进程的状态。WCONTINUED也等待被停止的子进程被继续的状态。 所以我们只要在信号处理回调函数中使用waitpid(-1, status, WNOHANG)即可避免前面回收资源不完全的情况。 void sigchld_handler(int signo) {pid_t pid;int status;// 在信号处理函数中循环调用waitpid以获取所有子进程的终止状态,其中-1表示等待任意子进程while ((pid waitpid(-1, status, WNOHANG)) 0) {printf(Child process %d exited with status %d\n, pid, WEXITSTATUS(status));} }结果如下 这样就回收了所有的僵尸进程的资源。
http://www.pierceye.com/news/701574/

相关文章:

  • 学网站建设的好处舟山外贸建站公司
  • 建设电影会员网站首页三亚网红餐厅
  • 建网站维护需要多少钱网站怎么做单页
  • 做纱线的网站wordpress创建页面地址设置
  • 怎么做多个网站单点登录flash网站读条怎么做
  • 网站建设免费的做网站一个人可以吗
  • 网站建设公司价格差别西安网站建设winkuo
  • 途牛网站建设株洲网站优化
  • 网站聊天怎么做网站数据库连接错误
  • 株洲网站优化哪家强网页动态设计
  • 百度是什么网站培训中心网站建设论文
  • 自己做的网站如何管理线上推广是做什么的
  • 关键字挖掘爱站网xampp配置多网站
  • 做社交网站搭建网站的步骤
  • 外围网站做代理关于网站建设需要的研究方法
  • 成都网站建设赢展怎样建设尧都水果网站
  • 网站建设英文文献佛山外贸网站推广
  • wordpress 网站显示ip哪里可以建网站
  • 网站是干嘛用的凡科教育
  • 黄页营销网站南京哪些公司做网站
  • 俄语网站推广工程公司名称大全
  • 怎么知道网站是php什么是网站推广?
  • 温州在线课堂番禺网站建设优化
  • php怎么做网站快大都会app下载最新版本
  • 麻城网站建设公司网络推广公司挣钱吗
  • t型布局网站的样子自己做的网站如何上传
  • 排版设计模板网站百度搜索下载安装
  • 网站页面建设需要ps吗网站建设结单 优帮云
  • 网站建设对我有什么好处网站首页被k 做跳转
  • 美辰网站建设网站建设公司转型做什