这才是使用ps命令的正确姿势( 二 )



这里我们在重点谈一下进程的状态 stat,我们看一个他的输出:
?  pthreads ps -o pid,ppid,stat,command    PID    PPID STAT COMMAND2782266   34624 Ss   /usr/bin/zsh2832729 2782266 SN   ./sleep.out2832740 2782266 R+   ps -o pid,ppid,stat,command在上面当中 STAT 那一列就是表示进程的状态 , 我们现在仔细分析一下上面字母表示的含义:
STAT 当中字母的含义表:
条目含义D表示不能够被中断的睡眠操作,比如说IO操作I内核当中的空闲线程R正在执行或者处于就绪队列当中的进程S可以被中断的睡眠,一般是等待某个事件触发T被其他的进程发送的信号给停下来了t被调试或者tracing中Z表示这个进程是一个僵尸进程<表示高优先级N表示低优先级L有页面被所在内存当中,也就是说这个页面不会被操作系统换出道对换区当中s表示这个进程是一个 session leaderl是一个多线程程序+表示在前台进程组当中

现在根据上面表格当中的内容我们可以知道:

  • 进程 2782266 正在等待某个事件触发,而且这个进程是 session leader 。
  • 进程 2832729 也是在等待某个事件触发 , 而且是低优先级的进程 。
  • 进程 2832740 正在执行 。
下图表示 linux 当中进程的几种状态:
这才是使用ps命令的正确姿势

文章插图
我们在来看一个多进程程序的例子:
#include <stdio.h>#include <unistd.h>#include <pthread.h>void* func(void* args) {  while (1)  {    /* code */  }}int main() {  for(int i = 0; i < 10; i++) {    pthread_t tid;    pthread_create(&tid, NULL, func, NULL);  }  while (1)  {    sleep(1);  }  return 0;}上面的程序执行完成之后 , ps 的输出结果如下:
?  pthreads ps -o pid,ppid,stat,command    PID    PPID STAT COMMAND2782266   34624 Ss   /usr/bin/zsh2840012 2782266 SNl  ./sleep.out # 这个进程就是上面那个程序表示的进程2840037 2782266 R+   ps -o pid,ppid,stat,command我们可以看到这个进程的 STAT 当中还有一个 l 表示这是一个多进程的程序 。
总结在本篇文章当中主要给大家介绍了一些常见的 ps 命令的使用方法 , 以及一些常用的输出,还有就是输出内容中比较重要的进程状态,能够很好的帮助我们实时去了解进程 。

推荐阅读