Я использую htop для osx, и я не могу понять, что означает статус C в столбце состояния S, для состояния процесса.
Что означает статус процесса C в htop?
Я использую htop для osx, и я не могу понять, что означает статус C в столбце состояния S, для состояния процесса.
Что означает статус процесса C в htop?
htop автор здесь. Я не знаю такого кода состояния в htop codebase. Имейте в виду, что htop написан только для Linux, поэтому поддержка macOS/OSX отсутствует. Когда я слышу о том, что люди запускают его на OSX, они часто используют устаревшую, неподдерживаемую fork (последняя версия htop 2.0.1, включая поддержку macOS).
Вот различные значения, которые будут отображаться в выходных спецификаторах s, stat и state (заголовок "STAT" или "S") для описания состояния процесса:
Источник: man ps
Недавно я наткнулся на второй список:
http://man7.org/linux/man-pages/man5/proc.5.html в разделе "/proc/[pid]/stat":
У меня такой же вопрос в последнее время. Мы можем попытаться найти его в 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" означает "Процесс, создаваемый fork". Что это? Согласно старым источникам unix, это переходное состояние, которое случается, когда недостаточно памяти при разрыве процесса, и родитель должен быть заменен.
Что??
Возврат к исходному файлу 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.
Обновление: исправлена ошибка . Yay с открытым исходным кодом!