2.13实验记录

c环境下
一、linux下

zombie2.c

#include<stdio.h>
#include<stdlib.h>
int main(){
        int i=0;
        int p=fork();
        if(p==0){
                sleep(5);
                printf("\nchild pid:%d,ppid:%d\n",getpid(),getppid());
        }
        if(p>0){
                printf("\nparent pid:%d,ppid:%d\n",getpid(),getppid());
                while(1){
                        sleep(1);
                        i++;
                }
        }
        return 0;
}

运行

gcc zombie2.c -o zombie2.out
./zombie2.out

在这里插入图片描述
ctrl+z挂起父进程,然后top查看,可以看见一个zombie

定位僵尸进程

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz] '

在这里插入图片描述
中止僵尸进程(杀死父进程以彻底结束僵尸进程)

kill -9 ppid

在这里插入图片描述
2.docker下
dockerfile

FROM gcc:latest
ADD zombie2.out /
CMD ["./zombie2.out"]

建立容器

docker build -t dockerfile .

docker ps查看container id

docker exec -it container_id /bin/bash
./zombie2.out

top查看,zombie进程数量为0
在这里插入图片描述

kill -9 父进程并重启,再次top查看
在这里插入图片描述
和linux下同样一个zombie进程

生成多个僵尸进程

#include<stdio.h>
#include<stdlib.h>
int main(){
        int i=0;
        while(i<10){
                i++;
                int p=fork();
                if(p==0){
                        sleep(1);
                        printf("\nchild pid:%d,ppid:%d",getpid(),getppid());
                        return 0;
                }
        if(p>0){
                }
        }
        while(1){
                sleep(10);
                i++;
        }
        return 0;
}

在这里插入图片描述

python环境下
生成一个僵尸进程

#! /usr/bin/python
import os,time

p=os.fork()
if p==0:
      time.sleep(1)
      print("\nchild pid:%d,ppid:%d\n",os.getpid(),os.getppid())

if p>0:
      print("parent pid:%d,ppid:%d",os.getpid(),os.getppid())
      while 1:
        time.sleep(10)

在这里插入图片描述

生成很多僵尸进程

#! /usr/bin/python
import os,time

i=0
while(i<10):
        i=i+1
        p=os.fork()
        if p==0:
                time.sleep(1)
                print("\nchild pid:%d,ppid:%d\n",os.getpid(),os.getppid())
        if p>0:

                while(1):
                        time.sleep(10)

在这里插入图片描述
只有最后一个进程变成了僵尸,因为每一个新的子进程都会变成下一个子进程的父进程
在这里插入图片描述

#! /usr/bin/python
import os,time

i=0
while(i<10):
        i=i+1
        p=os.fork()
        if p==0:
                time.sleep(1)
                print "child pid:%d,ppid:%d\n" % (os.getpid(),os.getppid())
        if p>0:
                print "parent pid:%d,ppid:%d\n" % (os.getpid(),os.getppid())
while(1):
        time.sleep(10)

完全无法生成僵尸

docker下
用python镜像生成一个容器,把生成僵尸和监测cpu的程序拷贝上去
docker cp 源地址 容器:目标地址

docker cp /root/codes/zomebietest/test.py mypython:/myapps/zombietest/

启动容器并运行僵尸程序
在这里插入图片描述
ctrl+z中断后top查看
在这里插入图片描述
用pythoncpu.py读取不到信息,top查看发现僵尸进程的cpu使用率是0,所以-bi读取不到,改成-b
要在docker中查看文件需要安装vim,apt-get install vim如果报错,则先apt-get update

在这里插入图片描述

发布了5 篇原创文章 · 获赞 2 · 访问量 2672

猜你喜欢

转载自blog.csdn.net/weixin_43621813/article/details/104294809