Linux 커널은 커널의 내부 데이터 구조에 액세스하고 proc 파일 시스템을 통해 런타임에 커널 설정을 변경하는 메커니즘을 제공합니다. proc 파일 시스템은 메모리에만 존재하고 외부 메모리 공간을 차지하지 않는 의사 파일 시스템입니다. 파일 시스템 형태로 시스템 커널 데이터에 접근하기 위한 인터페이스를 제공합니다.
사용자와 애플리케이션은 proc을 통해 시스템 정보를 얻고 커널의 특정 매개변수를 변경할 수 있습니다. 프로세스 등 시스템 정보는 동적으로 변경되므로 사용자나 애플리케이션이 proc 파일을 읽으면 proc 파일 시스템은 시스템 커널에서 필요한 정보를 동적으로 읽어 제출합니다.
커널 구성 및 로드된 모듈에 따라 아래 나열된 파일 또는 하위 폴더 중 일부가 시스템에 존재하지 않습니다. 또한 proc 아래에는 net, scsi 및 sys라는 세 가지 매우 중요한 디렉터리가 있습니다. sys 디렉토리는 쓰기 가능하며 커널 매개변수에 액세스하거나 수정하는 데 사용할 수 있는 반면, net 및 scsi는 커널 구성에 따라 다릅니다. 예를 들어, 시스템이 scsi를 지원하지 않으면 scsi 디렉토리가 존재하지 않습니다.
위에 소개한 디렉토리 외에도 숫자로 명명된 디렉토리도 있는데, 이는 프로세스 디렉토리입니다. 현재 시스템에서 실행 중인 각 프로세스에는 proc 아래에 해당 디렉터리가 있으며, 프로세스의 PID 번호는 디렉터리 이름으로 사용됩니다. 이는 프로세스 정보를 읽기 위한 인터페이스입니다. self 디렉터리는 프로세스 자체를 읽기 위한 정보 인터페이스이자 링크입니다.
/proc/[pid]/auxv에는 프로세스에 전달된 ELF 인터프리터 정보가 포함되어 있습니다. 형식은 각 항목이 부호 없는 긴 길이 ID에 부호 없는 긴 길이 값을 더한 것입니다. 마지막 항목은 두 개의 0x00이 연속으로 시작됩니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/cmdline은 프로세스의 전체 명령줄 정보가 포함된 읽기 전용 파일입니다. 프로세스가 메모리에서 교체되었거나 프로세스가 좀비 프로세스인 경우 이 파일에는 내용이 없습니다. 파일은 개행 문자 대신 널 문자로 끝납니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/comm에는 프로세스의 명령 이름이 포함되어 있습니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/cwd는 프로세스의 현재 작업 디렉터리에 대한 심볼릭 링크입니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/environ은 프로세스의 환경 변수를 표시합니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/exe는 실제 실행 중인 프로그램에 대한 심볼릭 링크입니다. 예는 다음과 같습니다:
으아아아/proc/[pid]/fd는 프로세스에서 연 파일이 포함된 디렉터리입니다. 예는 다음과 같습니다:
으아아아디렉토리의 각 항목은 열려 있는 파일을 가리키는 심볼릭 링크이며, 숫자는 파일 설명자를 나타냅니다.
/proc/[pid]/latency 어떤 코드가 더 큰 지연을 일으키는지 보여줍니다. 이 기능을 사용하려면 다음을 실행해야 합니다.
으아아아예제는 다음과 같습니다
으아아아각 줄의 처음 세 숫자는 다음 코드가 실행된 횟수, 총 실행 지연 시간(단위는 마이크로초) 및 최대 실행 지연 시간(단위는 마이크로초)입니다. 다음은 코드의 전체 호출 스택입니다.
/proc/[pid]/maps 显示进程的内存区域映射信息。举例如下:
$ cat /proc/2406/maps 00400000-006ea000 r-xp 00000000 fd:01 1727569 /usr/bin/frps 006ea000-00a6c000 r--p 002ea000 fd:01 1727569 /usr/bin/frps 00a6c000-00ab1000 rw-p 0066c000 fd:01 1727569 /usr/bin/frps 00ab1000-00ad4000 rw-p 00000000 00:00 0 c000000000-c00000b000 rw-p 00000000 00:00 0 c41feac000-c420000000 rw-p 00000000 00:00 0 c420000000-c420400000 rw-p 00000000 00:00 0 c420400000-c420700000 rw-p 00000000 00:00 0 c420700000-c420800000 rw-p 00000000 00:00 0 c420800000-c420900000 rw-p 00000000 00:00 0 c420900000-c420a00000 rw-p 00000000 00:00 0 c420a00000-c421ea0000 rw-p 00000000 00:00 0 c421ea0000-c422a00000 rw-p 00000000 00:00 0 c422a00000-c422a60000 rw-p 00000000 00:00 0 7f0418c01000-7f0418ee1000 rw-p 00000000 00:00 0 7ffff7f4f000-7ffff7f70000 rw-p 00000000 00:00 0 [stack:5121] 7ffff7fad000-7ffff7faf000 r--p 00000000 00:00 0 [vvar] 7ffff7faf000-7ffff7fb1000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
其中注意的一点是 [stack:] 是线程的堆栈信息,对应于 /proc/[pid]/task/[tid]/ 路径。
/proc/[pid]/root 是进程根目录的符号链接。举例如下:
$ ls -lt /proc/2406/root lrwxrwxrwx 1 root root 0 Dec 12 20:39 /proc/2406/root -> /
/proc/[pid]/stack 示当前进程的内核调用栈信息,只有内核编译时打开了 CONFIG_STACKTRACE 编译选项,才会生成这个文件。举例如下:
$ cat /proc/2406/stack [<ffffffff810fa996>] futex_wait_queue_me+0xc6/0x130 [<ffffffff810fb05d>] futex_wait+0x17d/0x270 [<ffffffff810fd2d5>] do_futex+0xd5/0x520 [<ffffffff810fd791>] SyS_futex+0x71/0x150 [<ffffffff8180cc76>] entry_SYSCALL_64_fastpath+0x16/0x75 [<ffffffffffffffff>] 0xffffffffffffffff </ffffffffffffffff></ffffffff8180cc76></ffffffff810fd791></ffffffff810fd2d5></ffffffff810fb05d></ffffffff810fa996>
/proc/[pid]/statm 显示进程所占用内存大小的统计信息。包含七个值,度量单位是 page(page大小可通过 getconf PAGESIZE 得到)。举例如下:
$ cat /proc/2406/statm 13720 2617 493 746 0 12007 0
各个值含义:
a)进程占用的总的内存 b)进程当前时刻占用的物理内存 c)同其它进程共享的内存 d)进程的代码段 e)共享库(从2.6版本起,这个值为0) f)进程的堆栈 g)dirty pages(从2.6版本起,这个值为0)
/proc/[pid]/status 包含进程的状态信息。其很多内容与 /proc/[pid]/stat 和 /proc/[pid]/statm 相同,但是却是以一种更清晰地方式展现出来。举例如下:
$ cat /proc/2406/status Name: frps State: S (sleeping) Tgid: 2406 Ngid: 0 Pid: 2406 PPid: 2130 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 128 Groups: 0 NStgid: 2406 NSpid: 2406 NSpgid: 2406 NSsid: 2130 VmPeak: 54880 kB VmSize: 54880 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 34872 kB VmRSS: 10468 kB VmData: 47896 kB VmStk: 132 kB VmExe: 2984 kB VmLib: 0 kB VmPTE: 68 kB VmPMD: 20 kB VmSwap: 0 kB HugetlbPages: 0 kB Threads: 11 SigQ: 0/31834 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: fffffffe7fc1feff CapInh: 0000000000000000 CapPrm: 0000003fffffffff CapEff: 0000003fffffffff CapBnd: 0000003fffffffff CapAmb: 0000000000000000 Seccomp: 0 Cpus_allowed: f Cpus_allowed_list: 0-3 Mems_allowed: 00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 2251028 nonvoluntary_ctxt_switches: 18031
关于信号(signal)的信息:SigQ 分为两部分(例如 0/31834),前面表示当前处在队列中的信号(0),后面则表示队列一共可以存储多少信号(31834);SigPnd 表示当前线程 pending 的信号,而ShdPnd 则表示整个进程 pending 的信号;SigBlk、SigIgn 和 SigCgt 分别表示对信号的处理是阻塞,忽略,还是捕获。(关于Unix信号的相关知识,可以参考 Unix: Dealing with signals)。
/proc/[pid]/syscall 显示当前进程正在执行的系统调用。举例如下:
$ cat /proc/2406/syscall 202 0xab3730 0x0 0x0 0x0 0x0 0x0 0x7ffff7f6ec68 0x455bb3
第一个值是系统调用号(202代表poll),后面跟着 6 个系统调用的参数值(位于寄存器中),最后两个值依次是堆栈指针和指令计数器的值。如果当前进程虽然阻塞,但阻塞函数并不是系统调用,则系统调用号的值为 -1,后面只有堆栈指针和指令计数器的值。如果进程没有阻塞,则这个文件只有一个 running 的字符串。
内核编译时打开了 CONFIG_HAVE_ARCH_TRACEHOOK 编译选项,才会生成这个文件。
/proc/[pid]/wchan 显示当进程 sleep 时,kernel 当前运行的函数。举例如下:
$ cat /proc/2406/wchan futex_wait_queue_meadmin
위 내용은 Linux의 /proc/[pid] 디렉토리에 있는 파일에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!