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

全面的郑州网站建设甘肃网站建设项目

全面的郑州网站建设,甘肃网站建设项目,网络营销平台推广方案,唐山建设网站公司一、僵尸进程 何为僵尸进程? 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时&#xff…




在这里插入图片描述




一、僵尸进程


何为僵尸进程?


        在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,操作系统内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等(比如malloc占用内存不释放,也会在此时释放),但是留下一个数据结构(只保留 struct task_struct 一个空壳子),这个结构保留了一定的信息(包括进程号 the process ID,退出状态,运行时间….),这些信息直到父进程通过 wait() / waitpid() 来取时才释放。这样设计的目的主要是保证父进程能够获取到子进程结束时的状态信息(父进程回收僵尸进程的时候可以根据 退出码 确定子进程的退出原因)。


而只剩下一个保留着退出状态等信息的数据结构的进程,即为僵尸进程



僵尸进程的危害


占用进程号:系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程僵尸进程会占用系统的进程表条目,如果系统中有大量僵尸进程存在而不被清理,可能会导致系统不能创建新的进程。这是因为进程ID(PID)是有限的,如果大部分都被僵尸进程占用,那么就没有足够的PID分配给新创建的进程。

有人说僵尸进程会占用内存:实际上,僵尸进程不占有任何内存空间,其本身并不会直接导致内存泄漏。内存泄漏更多是程序设计的问题,而不是操作系统层面的问题。僵尸进程最大的危害是占用进程号,导致系统无法产生新进程。



僵尸进程的的创建


子进程在 exit() 之后,父进程没有来得及处理,这时用 ps 命令就能看到子进程的状态是“Z”,即为僵尸状态

创造一个僵尸进程思路:保证父进程不死,子进程创建后使用 exit(0) 退出

这条 71780 号进程即为状态 Z 的僵尸进程(defunct 意思是已失效)

在这里插入图片描述


#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>int main(){printf("I am 父进程, pid : %d\n", getpid());pid_t id = fork();// 父进程:死循环维持生命if(id > 0){printf("这是新建的子进程: %d\n", id);while(1){printf("I am 父进程, pid : %d\n", getpid());sleep(1);};}// 子进程: 创建后退出,形成僵尸进程else if(id == 0){exit(0);		}return 0;
}


二、孤儿进程


何为孤儿进程?


孤儿进程:当某个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程并不是无父无母的 “野孩子”,而是会被系统默认的 init 进程所收养。(或者是现代 Linux 系统中的 systemd 进程,在早期的 Unix 系统中通常是 PID = 1init 进程)


        当一个进程成为孤儿进程后,它的直接父进程变成了 init systemd ,这样可以确保每个进程都有一个父进程。 init systemd 作为“养父”,不会像真正的父进程那样去管理和控制孤儿进程的行为,但它会负责清理孤儿进程的退出状态。也就是说,当孤儿进程最终终止时, init systemd 会接收到孤儿进程的退出通知,并更新系统的进程表。即 “养父” 会默认管理孤儿进程的退出状态,会帮它回收,不会使其变成僵尸进程,因此孤儿进程并不会有什么危害。



三、如何杀掉僵尸进程?


注意:僵尸进程不能被系统的 kill -9 信号杀死(SIGKILL只能发送给仍在运行的进程) (因为僵尸进程已经死了,是死掉的进程,当然也不能响应系统的信号)

1、被父进程回收

通过 wait() /waitpid() 才释放

2、可以杀掉它的父进程

        ​父进程被杀掉之后,僵尸进程会变成孤儿进程,孤儿进程会被系统的 1 号进程收留(即 Init 进程),1 号进程会检查该进程是不是僵尸进程,如果是的话则会将进程回收。


3、设置信号处理器

    父进程可以在创建子进程之前设置SIGCHLD信号的处理函数,当子进程结束时,操作系统会向父进程发送SIGCHLD信号。父进程可以在这个信号的处理函数中调用wait()waitpid()来清理僵尸进程。

#include <signal.h>
//...
void handle_child(int signum) {int status;waitpid(-1, &status, WNOHANG); // 非阻塞方式回收
}// 设置信号处理器
signal(SIGCHLD, handle_child);


http://www.yayakq.cn/news/725863/

相关文章:

  • 电子商务的网站开发的工作内容芜湖十大网络公司
  • 展览馆网站建设方案书安徽网站建设SEO优化制作设计公司
  • 舟山建设银行纪念币预约网站wordpress用户名钩子
  • 有用的网站地址长沙网站制作价格
  • 门户网站平台建设的经费做网站和推广工资多少
  • 襄樊网站建设哪家好conoha wordpress
  • 企业网站在线超市手机建站教程
  • 仿门户网站多功能js相册画廊源码 支持缩略小图浏览wordpress手机号注册插件
  • 射阳建设网站网站建设工作是干什么的
  • 做网站的边框上海网站建设海淘科技
  • 网站制作模板下载广西建设教育学会网站
  • 高端型网站制作英文外贸网站建设网站设计方案
  • 网站首页大图轮播利尔化学股票
  • 很那网站建设网站建设电话销售模版
  • 郑州汉狮专业做网站公司做一人网站要多少钱
  • 发布信息的免费平台wordpress数据库优化插件
  • 佛山网站建设公司点精小胡做会计网站的流程图
  • wordpress带轮播企业站主题庆阳网站建设
  • 为什么网站有不同的扩展名给传销做网站
  • 档案网站建设规范有哪些广告推广赚钱
  • 高埗镇做网站加盟广告
  • 包装设计网站有哪些最近发生的新闻
  • 建产品网站怎么做河北邯郸地震最新消息今天
  • 网站空间 上传程序网站维护外包合同
  • 微网站做的比较好莆田seo全网营销
  • 路由器设置手机网站打不开网站备案号有效期
  • jsp可以做网站首页吗建设第二个北京在哪里
  • 不同类型网站优势手机模板
  • 商城网站建设正规公司温州通业建设工程有限公司网站
  • 大冶网站开发广州手机网站设计