Как работает команда ps?

Как работает команда ps?

Для задания мне нужно реализовать собственную версию команды ps, но я не уверен, откуда она берет информацию. Где мне искать всю информацию о процессе?

решение1

В Linux psкоманда работает путем чтения файлов вфайловая система proc. Каталог содержит различные файлы, которые предоставляют информацию о процессе/proc/PIDПИД. Содержимое этих файлов генерируется ядром «на лету», когда процесс их считывает.

Документацию о записях можно найти /procвСтраница руководства proc(5)и вдокументация ядра.

Вы можете выяснить это самостоятельно, наблюдая за тем, что psделает командаstrace, команда, которая выводит список системных вызовов, выполненных процессом.

% strace -e open ps
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libprocps.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY)       = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/proc/sys/kernel/pid_max", O_RDONLY) = 4
open("/proc/meminfo", O_RDONLY)         = 4
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/2/stat", O_RDONLY)          = 6
open("/proc/2/status", O_RDONLY)        = 6
open("/proc/3/stat", O_RDONLY)          = 6
open("/proc/3/status", O_RDONLY)        = 6

% strace -e open ps
open("/proc/1/stat", O_RDONLY)          = 6
open("/proc/1/status", O_RDONLY)        = 6
open("/proc/1/cmdline", O_RDONLY)       = 6

решение2

Возможно, вам захочется заглянуть в /procпапку:
у каждого процесса, запущенного на вашем компьютере, есть подпапка с большим количеством файлов (на мой взгляд, наиболее полезной является comm, которая содержит имя процесса).

решение3

Работает с использованием библиотеки libprocps.so.

Основной формат:

(A) запуск (вызов openproc())

(B) чтение информации о процессе (вызов readproc() для каждого)

(C) остановить (вызов closeproc())

Использование libprocps.so дает как преимущества (например, избавляет от необходимости кодировать кучу функций «анализа»), так и недостатки (возможно, вам нужно меньше информации, чем собрано вызовами readproc()).

Программа, использующая libprocps.so, имеет этот базовый формат.

    #include <proc/readproc.h>
         :
    int main()
   {
         :
       PROCTAB *proctab = openproc(<OPTIONS>) ;
         :
         :
       proc_t procinfo ;
       memset(&procinfo, 0, sizeof(procinfo)) ;
       while(readproc(proctab, &procinfo) != nullptr)
       {
          <do something with procinfo data>
       }
         :
         :
       closeproc(proctab) ;
       return 0 ;
    }

procinfo будет содержать всю информацию о процессе (например, utime, stime, priority, nice, ppid и т. д.) уже в числовом формате. Если вы загрузили исходники,proc_tструктура определена в readproc.h

TheПАРАМЕТРЫВ вызове openproc() можно использовать флаги побитового ИЛИ, поэтому можно использовать один или несколько из них, например:

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

Они также определены в readproc.h (найдите «#define PROC_FILLMEM»).

Связанный контент