과제를 수행하려면 내 자신의 명령 버전을 구현해야 하는데 ps
해당 정보를 어디서 가져오는지 잘 모르겠습니다. 모든 프로세스 정보는 어디에서 찾을 수 있나요?
답변1
Linux에서 ps
명령은 다음 위치에 있는 파일을 읽어 작동합니다.proc 파일 시스템. 디렉토리에는 프로세스에 대한 정보를 제공하는 다양한 파일이 포함되어 있습니다./proc/PID
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
.
시스템에서 실행 중인 모든 프로세스에는 여기에 많은 파일이 포함된 하위 폴더가 있습니다(가장 유용한 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 등)를 이미 숫자 형식으로 보유합니다. 소스를 다운로드하셨다면,proc_t구조체는 readproc.h에 정의되어 있습니다.
그만큼옵션openproc() 호출에서 비트별 또는 플래그를 사용할 수 있으므로 다음과 같이 하나 이상을 사용할 수 있습니다.
PROCTAB *proctab = openproc(PROC_FILLMEM | PROC_FILLCOM) ;
readproc.h에도 정의되어 있습니다('#define PROC_FILLMEM' 검색).