這才是使用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 命令的使用方法 , 以及一些常用的輸出,還有就是輸出內容中比較重要的進程狀態,能夠很好的幫助我們實時去了解進程 。

推薦閱讀