2013-08-27 52 views

回答

20

HTOP筆者在這裏。我不知道這種狀態代碼在htop代碼庫中。 請記住,htop僅爲Linux編寫,因此不支持macOS/OSX。當我聽說有人在OSX上運行它時,他們經常使用過時的,不受支持的分支(最新版htop是2.0.1,包括macOS支持)。

42

下面是在S,STAT和狀態輸出說明符(標頭「STAT」或「S」)將顯示來描述一個進程的狀態的不同的值:

d不間斷睡眠(通常IO)

R運行從或可運行(在運行隊列)

š中斷睡眠(等待一個事件來完成)

T已停止,或者通過作業控制信號,或因爲它正在被跟蹤。

W¯¯分頁(因爲在2.6.xx內核無效)

X死(不應該看到的)

ž解散(「殭屍」)過程中,終止,但不是由其父收穫。

來源:男子PS

14

我最近有同樣的問題。我們可以嘗試看看它在htop sources

process->state = 
    ProcessList_decodeState(p->p_stat == SZOMB ? SZOMB : ki->state); 

static int 
ProcessList_decodeState(int st) { 
    switch (st) { 
    case SIDL: 
    return 'C'; 
    case SRUN: 
    return 'R'; 
    case SSLEEP: 
    return 'S'; 
    case SSTOP: 
    return 'T'; 
    case SZOMB: 
    return 'Z'; 
    default: 
    return '?'; 
    } 
} 

所以我們去的過程狀態的Unix的定義在/usr/include/sys/proc.h:

/* Status values. */ 
#define SIDL 1  /* Process being created by fork. */ 
#define SRUN 2  /* Currently runnable. */ 
#define SSLEEP 3  /* Sleeping on an address. */ 
#define SSTOP 4  /* Process debugging or suspension. */ 
#define SZOMB 5  /* Awaiting collection by parent. */ 

所以,「C '狀態意味着'流程由叉子創建'。它是什麼?根據old unix sources,這是一個暫時的狀態,當分叉進程時沒有足夠的內存時,父節點需要被換出。

什麼?

返回htop源代碼。我們在哪裏得到ki->state

// For all threads in process: 
error = thread_info(ki->thread_list[j], THREAD_BASIC_INFO, 
        (thread_info_t) & ki->thval[j].tb, 
        &thread_info_count); 

tstate = ProcessList_machStateOrder(ki->thval[j].tb.run_state, 
            ki->thval[j].tb.sleep_time); 
if (tstate < ki->state) 
    ki->state = tstate; 

// Below... 
static int 
ProcessList_machStateOrder(int s, long sleep_time) { 
    switch (s) { 
    case TH_STATE_RUNNING: 
    return 1; 
    case TH_STATE_UNINTERRUPTIBLE: 
    return 2; 
    case TH_STATE_WAITING: 
    return (sleep_time > 20) ? 4 : 3; 
    case TH_STATE_STOPPED: 
    return 5; 
    case TH_STATE_HALTED: 
    return 6; 
    default: 
    return 7; 
    } 
} 

// In mach/thread_info.h: 
#define TH_STATE_RUNNING 1 /* thread is running normally */ 
#define TH_STATE_STOPPED 2 /* thread is stopped */ 
#define TH_STATE_WAITING 3 /* thread is waiting normally */ 
#define TH_STATE_UNINTERRUPTIBLE 4 /* thread is in an uninterruptible wait */ 
#define TH_STATE_HALTED 5 /* thread is halted at a clean point */ 

我們有以下的(搞砸)映射:

Thread state    | Mapped to | htop state| 'top' state | 'ps' state 
---------------------------------------------------------------------------- 
TH_STATE_RUNNING   | SIDL(1) |  'C' | running  | 'R' 
TH_STATE_UNINTERRUPTIBLE | SRUN(2) |  'R' | stuck  | 'U' 
TH_STATE_WAITING (short) | SSLEEP(3) |  'S' | sleeping | 'S' 
TH_STATE_WAITING (long) | SSTOP(4) |  'T' | idle  | 'I' 
TH_STATE_STOPPED   | SZOMB(5) |  'Z' | stopped  | 'T' 

那麼,真正的答案是:'C' 意味着進程正在運行。

它是怎麼發生的?似乎ki->state處理是從ps source借用的,並未針對Unix進程代碼進行調整。

更新:此bug is fixed。耶開源!