进程状态

107 阅读2分钟

读者可以根据我的操作去打linux指令,这里不介绍指令,如果有状态不掩饰,表明此状态无法演示或者系统不会显示出来

运行状态(R)

顾名思义,就是在运行中的程序,不过我们基本查看不到,因为CPU的执行速度过快,多数时候我们看到的都是休眠状态(S+)

睡眠状态(S)

意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)

image.png

磁盘休眠状态(D)

有时候也叫不可中断睡眠状态,即杀不掉的状态,正常情况下无法演示

停止状态(T)

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行

读者可以自己写一个死循环 image.png image.png 同时我们会发现原来的S变为S+,即从前台变为后台,后台任务只能用kill命令去杀死,不然无法终止

死亡状态(X)

这个状态只是一个返回状态,你不会在任务列表里看到这个状态

僵尸进程(Z)

当进程退出并且父进程(使用wait()系统调用),没有读取到子进程的退出码就会变成僵尸进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

#include<stdio.h>
#include<unistd.h>
int main()
{
   pid_t id =fork();
   if(id==0)
   {
     //子进程
     while(1)
     {
         printf("我是子进程,我的pid是%d,我的ppid是%d\n",getpid(),getppid());
     }
   }
   else
   {
       while(1)
       {
           printf("我是父进程,我的pid是%d,我的ppid是%d\n",getpid(),getppid());
       }
   }
     return 0;
}

运行以后有如下状态,在我们杀掉子进程的时候,子进程会变为僵尸状态,不会立马被系统回收 image.png

孤儿进程

父进程先退出,子进程就称之为“孤儿进程” 孤儿进程被1号init进程领养,当然要有init进程回收喽

#include<stdio.h>
#include<unistd.h>
int main()
{
   pid_t id =fork();
   if(id==0)
   {
     //子进程
     while(1)
     {
         printf("我是子进程,我的pid是%d,我的ppid是%d\n",getpid(),getppid());
     }
   }
   else
   {
       int cnt=10;
       while(--cnt)
       {
           printf("我是父进程,我的pid是%d,我的ppid是%d\n",getpid(),getppid());
       }
   }
     return 0;
}

image.png