답변:
에서 파일을 읽을 때마다 /proc
파일 내용으로 읽을 텍스트를 계산하는 커널의 일부 코드를 호출합니다. 내용이 즉석에서 생성된다는 사실은 거의 모든 파일의 시간이 현재로보고되고 크기가 0으로보고 된 이유를 설명합니다. 여기서 0은 "모름"으로 표시되어야합니다. 일반적인 파일 시스템과 달리 procfs/proc
라고 하는에 마운트 된 파일 시스템은 디스크 나 다른 스토리지 미디어 (FAT, ext2, zfs 등) 또는 네트워크 (NFS, Samba 등)를 통해 데이터를로드하지 않습니다. FUSE 와 달리 사용자 코드를 호출하지 않습니다 .
Procfs는 대부분의 비 BSD 유니스에 존재합니다. 이 글은 AT & T의 벨 연구소에서의 생활을 시작 UNIX 8 판 프로세스에 대한 정보를보고하는 방법으로 (그리고 ps
정보를 통해 읽어 종종 꽤-프린터입니다 /proc
). 대부분의 procfs 구현에는 /proc/123
PID 123으로 프로세스에 대한 정보를보고하기 위해 호출되는 파일 또는 디렉토리가 있습니다 . Linux는 proc 파일 시스템을 확장하여 시스템 상태를보고하는 더 많은 항목을 포함합니다 (예 :) /proc/cpuinfo
.
과거에는, 리눅스는 /proc
드라이버에 대한 정보를 제공하는 다양한 파일을 인수하지만,이 사용은 지금의 호의에서 더 이상 사용되지 않습니다 /sys
, 그리고 /proc
이제 서서히 진화. 항목 좋아 /proc/bus
하고 /proc/fs/ext4
그들은 호환성을 위해 남아있는 곳이지만 새로운 유사한 인터페이스에 생성된다 /sys
. 이 답변에서는 Linux에 중점을 둘 것입니다.
/proc
Linux에 대한 설명서의 첫 번째 및 두 번째 진입 점 은 다음과 같습니다.
proc(5)
man 페이지 ;/proc
파일 시스템 에서 커널 문서 .설명서에서 다루지 않은 세 번째 진입 점 은 소스를 읽는 것입니다 . 머신에서 소스를 다운로드 할 수 있지만 이는 큰 프로그램이며 Linux 상호 참조 인 LXR 은 큰 도움이됩니다. (LXR에는 많은 변형이 있으며, 실행되는 lxr.linux.no
것이 훨씬 좋지만 불행히도 사이트는 종종 다운됩니다.) C에 대한 약간의 지식이 필요하지만 신비한 가치를 추적하기 위해 프로그래머가 될 필요는 없습니다. .
/proc
항목 의 핵심 처리 는 fs/proc
디렉토리에 있습니다. 모든 드라이버는에 항목을 등록 할 수 있습니다 /proc
(위에 표시된 것처럼이 기능은 더 이상 사용되지 않습니다).에서 /sys
원하는 것을 찾을 수 없으면 fs/proc
다른 곳을 찾으십시오. 드라이버는에 선언 된 함수를 호출합니다 include/linux/proc_fs.h
. 커널 버전 3.9까지이 기능 제공 create_proc_entry
및 일부 래퍼 (특히 create_proc_read_entry
), 커널 버전 3.10 이상 대신만을 제공 proc_create
하고 proc_create_data
(그리고 몇 가지 더).
촬영 /proc/cpuinfo
예를 들어,에 대한 검색 "cpuinfo"
에 통화에 인도 proc_create("cpuinfo, …")
에서 fs/proc/cpuinfo.c
. 코드가 대부분 상용구 코드라는 것을 알 수 있습니다. 대부분의 파일은 /proc
텍스트 데이터 만 덤프하기 때문에이를 수행하는 도우미 기능이 있습니다. seq_operations
구조 는 단지 존재 하며 실제 고기는 cpuinfo_op
데이터 구조에 있으며, 구조에 따라 다르며 일반적으로 arch/<architecture>/kernel/setup.c
다른 파일로 정의됩니다 . x86을 예로 들어 보겠습니다 arch/x86/kernel/cpu/proc.c
. 주요 기능은show_cpuinfo
원하는 파일 내용을 인쇄합니다. 나머지 인프라는 데이터를 요청하는 속도로 읽기 프로세스에 데이터를 공급합니다. CPU 주파수 와 같이 즉석에서 계산 된 몇 개의 숫자를 포함하여 커널의 다양한 변수의 데이터에서 데이터가 즉시 조립되는 것을 볼 수 있습니다 .
의 대부분은 /proc
프로세스 별 정보입니다 /proc/<PID>
. 이러한 항목은 배열fs/proc/base.c
에 등록됩니다 . 여기에 등록 된 일부 기능은 다른 파일에 정의되어 있습니다. 이러한 항목이 생성되는 방법에 대한 몇 가지 예를 살펴 보겠습니다.tgid_base_stuff
cmdline
proc_pid_cmdline
같은 파일에 의해 생성됩니다 . 프로세스에서 데이터를 찾아 인쇄합니다.clear_refs
지금까지 본 항목과 달리 쓰기 가능하지만 읽을 수는 없습니다. 따라서 proc_clear_refs_operations
구조는 clear_refs_write
함수를 정의 하지만 읽기 기능 은 정의 하지 않습니다.cwd
로 선언 된 기호 링크 (약간의 마술 링크) 는 프로세스의 현재 디렉토리proc_cwd_link
를 조회 하여 링크 컨텐츠로 리턴합니다.fd
하위 디렉토리입니다. 디렉토리 자체의 오퍼레이션은 proc_fd_operations
데이터 구조 ( proc_readfd
프로세스의 열린 파일 을 열거하는 엔트리를 열거하는 함수를 제외하고 상용구)에 정의되어 있으며 엔트리 에 대한 오퍼레이션은 `proc_fd_inode_operations에 있습니다.의 또 다른 중요한 영역 /proc
IS /proc/sys
에 직접 인터페이스입니다 sysctl
. 이 계층 구조의 항목을 읽으면 해당 sysctl 값이 반환되고 쓰기는 sysctl 값을 설정합니다. sysctl의 진입 점은에 fs/proc/proc_sysctl.c
있습니다. Sysctls에는 자신 register_sysctl
과 친구 가있는 자체 등록 시스템이 있습니다.
무대 뒤에서 어떤 종류의 마술이 일어나고 있는지에 대한 통찰력을 얻으려고 할 때 가장 친한 친구가 strace
있습니다. 이 도구를 사용하는 법을 배우는 것은 무대 뒤에서 미친 마법이 일어나고있는 것에 대해 더 잘 이해하기 위해 할 수있는 가장 좋은 방법 중 하나입니다.
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
위 출력에서 당신 /proc/cpuinfo
은 단지 일반 파일이거나 적어도 하나 인 것처럼 보일 수 있습니다. 더 깊이 파고 봅시다.
파일 자체를 보면 "단지 파일"인 것처럼 보입니다.
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
그러나 자세히 살펴보십시오. 우리는 첫 번째 힌트를 얻습니다. 파일의 크기는 0 바이트입니다.
# 2- 통계 포함이제 파일을 사용하여 파일을 살펴보면에 stat
대해 특별한 것이 있다는 다음 힌트를 얻을 수 있습니다 /proc/cpuinfo
.
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
2 번을 뛰다
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
액세스, 수정 및 변경 시간을 확인 하시겠습니까? 액세스 할 때마다 계속 변경됩니다. 이것은 3 가지가 모두 그렇게 바뀌는 것은 매우 드문 일입니다. 파일의 타임 스탬프 속성을 편집하지 않으면 일반적으로 동일하게 유지됩니다.
# 3- 파일 포함이 파일이 일반 파일이 아니라는 또 다른 단서가 있습니다.
$ file /proc/cpuinfo
/proc/cpuinfo: empty
명명 된 파이프의 일부인 경우 다음 파일 중 하나와 유사하게 표시됩니다.
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
우리가 접촉하는 경우 emptyfile
, /proc/cpuinfo
더 후 파일 파이프 등이 될 것으로 보인다 않습니다
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
# 4- 마운트 포함
따라서이 시점에서 한 걸음 물러서서 조금 축소해야합니다. 우리는 특정 파일을보고 있지만이 파일이있는 파일 시스템을보고있을 것입니다. 그리고 이것을 위해 우리는 mount
명령을 사용할 수 있습니다 .
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
파일 시스템 유형은 유형 proc
입니다. 따라서 /proc
다른 파일 시스템 유형이 있습니다. 이는 아래 파일 /proc
이 특별 하다는 힌트입니다 . 그들은 단지 당신의 밀 파일 실행이 아닙니다. proc
파일 시스템을 특별 하게 만드는 것에 대한 더 많은 정보를 찾아 보자 .
mount
의 매뉴얼 페이지를 살펴보십시오 .
proc 파일 시스템은 특수 장치와 연결되어 있지 않으며 마운트 할 때 장치 사양 대신 proc과 같은 임의의 키워드를 사용할 수 있습니다. (일반적인 선택은 그다지 좋지 않습니다. umount의 'none busy'오류 메시지는 혼동 될 수 있습니다.)
그리고 우리 proc
의 매뉴얼 페이지를 보면 :
proc 파일 시스템은 커널 데이터 구조에 대한 인터페이스로 사용되는 의사 파일 시스템입니다. 일반적으로 / proc에 마운트됩니다. 대부분 읽기 전용이지만 일부 파일에서는 커널 변수를 변경할 수 있습니다.
같은 매뉴얼 페이지에서 조금 더 아래로 :
/ proc / cpuinfo
이것은 지원되는 각 아키텍처마다 다른 목록 인 CPU 및 시스템 아키텍처 종속 항목의 모음입니다. 두 개의 공통 항목은 CPU 번호와 bogomips를 제공하는 프로세서입니다. 커널 초기화 중에 계산되는 시스템 상수 SMP 머신에는 각 CPU에 대한 정보가 있습니다. lscpu (1) 명령은이 파일에서 정보를 수집합니다.
매뉴얼 페이지의 맨 아래에는 / proc FILESYSTEM 이라는 제목의 커널 문서에 대한 참조가 있습니다 . 해당 문서에서 인용 :
proc 파일 시스템은 커널의 내부 데이터 구조에 대한 인터페이스 역할을합니다. 시스템에 대한 정보를 얻고 런타임 (sysctl)에서 특정 커널 매개 변수를 변경하는 데 사용할 수 있습니다.
그래서 우리는 여기서 무엇을 배웠습니까? 그것이 /proc
의사 파일 시스템이라고도하고 "내부 데이터 구조에 대한 인터페이스"라고도하며, 그 안에있는 항목이 실제 파일이 아니라 파일처럼 보이기 만하지만 실제로 는 그렇지 않다고 가정하는 것이 안전 할 것입니다 .
나는 man 5 proc
2004 년경 의 이전 버전에 있었지만 어떤 이유로 든 더 이상 포함되지 않은 이 인용문으로 마무리 할 것입니다 . 참고 : 그것이 무엇인지 잘 설명했기 때문에 왜 제거되었는지 확실하지 않습니다 /proc
.
GNU / Linux 시스템의 / proc 디렉토리는 커널 인터페이스와 같은 파일 시스템을 제공합니다. 따라서 응용 프로그램과 사용자는 정상적인 파일 시스템 I / O 작업을 사용하여 커널에서 정보를 가져 와서 값을 설정할 수 있습니다.
proc 파일 시스템은 프로세스 정보 의사 파일 시스템이라고도합니다. 여기에는``실제 ''파일이 아니라 런타임 시스템 정보 (예 : 시스템 메모리, 마운트 된 장치, 하드웨어 구성 등)가 포함됩니다. 이러한 이유로 커널의 제어 및 정보 센터로 간주 될 수 있습니다. 실제로, 많은 시스템 유틸리티는 단순히이 디렉토리의 파일을 호출합니다. 예를 들어, 커널에 의해로드 된 모듈을 나열하는 lsmod 명령은 기본적으로 'cat / proc / modules'와 동일하지만 시스템의 PCI 버스에 연결된 장치를 나열하는 lspci는 'cat / proc / pci '. 이 디렉토리에있는 파일을 변경하면 시스템이 실행되는 동안 커널 매개 변수를 변경할 수 있습니다.
출처 : proc pseudo 파일 시스템
strace -o catcpuproc.txt cat /proc/cpuinfo
@slm의 대답은 매우 포괄적이지만 간단한 설명은 관점의 변화에서 비롯된 것으로 생각됩니다.
일상적인 사용에서는 파일을 물리적 인 것으로 생각할 수 있습니다. 일부 장치에 저장된 데이터 덩어리. 이것은 / proc / cpuinfo와 같은 파일을 매우 신비스럽고 혼란스럽게 만듭니다. 그러나 파일을 인터페이스 로 생각하면 모든 것이 완벽합니다 . 일부 프로그램에서 데이터를주고받는 방법.
이러한 방식으로 데이터를 송수신하는 프로그램은 파일 시스템 또는 드라이버입니다 (이 용어를 정의하는 방법에 따라 정의가 너무 광범위하거나 너무 좁을 수 있음). 중요한 점은 이러한 프로그램 중 일부 는 하드웨어 장치를 사용하여이 인터페이스를 통해 전송 된 데이터를 저장하고 검색한다는 것입니다. 그러나 전부는 아닙니다.
저장 장치를 사용 하지 않는 (적어도 직접적으로) 파일 시스템의 일부 예 는 다음과 같습니다.
Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs )는 파일을 일반적인 프로그래밍 인터페이스로 사용하는 극단적 인 예입니다.