2013-08-27 15 views

Odpowiedz

20

htop autor tutaj. Nie znam takiego kodu statusu w bazie kodu htop. Należy pamiętać, że htop jest napisany tylko dla systemu Linux, więc nie ma wsparcia dla macOS/OSX. Kiedy słyszę o ludziach używających tego systemu na OSXie, często używają przestarzałego, nieobsługiwanego widelca (najnowsza wersja htop to 2.0.1, w tym obsługa macOS).

42

Oto różne wartości, że e, STAT i stan Specyfikatory wyjściowe (nagłówek „STAT” lub „S”) ukażą się do opisania stanu procesu:

D bezprzerwowe snu (zwykle IO)

R działa albo uruchamianego (w kolejce roboczym)

S przerywane snu (oczekiwanie na zdarzenie na zakończenia)

T zatrzymany albo przez sygnał sterowania praca lub dlatego, że jest śledzona.

W stronicowania (nie ważne od jądra 2.6.xx)

X martwe (nigdy nie powinny być postrzegane)

Z Nieistniejący ("zombie") proces, zakończone jednak nie odnieść przez jego rodzica.

Źródło: mężczyzna ps

14

Mam ostatnio to samo pytanie. Możemy starać się szukać go w 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 '?'; 
    } 
} 

Więc idziemy do Unix definicji stanów procesu w /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. */ 

Tak, „C "status ma być" Proces tworzony przez fork ". Co to jest? Zgodnie z old unix sources, jest to stan przejściowy, który występuje, gdy nie ma wystarczającej ilości pamięci podczas rozwidlania procesu i rodzic musi zostać zamieniony.

Co?

Powrót do źródła htop. Skąd mamy 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 */ 

Mamy następujące (pomieszane) mapowanie:

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' 

Tak, prawdziwa odpowiedź brzmi: 'C' oznacza, że ​​proces jest uruchomiony.

Jak to się stało? Wydaje się, że obsługa ki->state została zapożyczona z ps source i nie została dostosowana do kodów procesowych Unix. Aktualizacja: bug is fixed Yay open source!