ps 명령은 어떻게 작동합니까?

ps 명령은 어떻게 작동합니까?

과제를 수행하려면 내 자신의 명령 버전을 구현해야 하는데 ps, 정보를 어디서 가져오는지 잘 모르겠습니다. 모든 프로세스 정보는 어디서 찾을 수 있나요?

답변1

Linux에서 이 ps명령은 다음과 같이 작동합니다.프로세스 파일 시스템. 이 디렉토리에는 프로세스에 대한 정보를 제공하는 다양한 파일이 포함되어 있습니다./proc/PIDPID. 프로세스가 이러한 파일의 내용을 읽을 때 커널은 이를 동적으로 생성합니다.

/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이 폴더를 살펴보는 것이 좋습니다 .
컴퓨터에서 실행 중인 모든 프로세스에는 여기에 여러 파일이 포함된 하위 폴더가 있습니다(가장 유용한 IMO 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, 우선 순위, nice, ppid 등)를 디지털 형식으로 저장합니다. 소스코드를 다운로드하셨다면,process_t구조체는 readproc.h에 정의되어 있습니다.

이것옵션openproc() 호출에서 비트 OR 플래그를 사용할 수 있으므로 다음과 같이 하나 이상을 사용할 수 있습니다.

    PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;

readproc.h에도 정의되어 있습니다("#define PROC_FILLMEM" 검색).

관련 정보