, , 및 같은 작업이 등록된 기능에 의해 처리되는 procfs
가상 파일 시스템을 활용하는 Linux에 대해 배우고 있습니다 .open
read
write
release
다음과 같은 Python 코드를 사용하여 파일의 내용을 읽으려고 할 때 실수로 open
및 를 null 포인터로 남겼습니다 .release
with open("/proc/testfile", "r") as f:
content = f.read()
프로그램이 멈추고 커널 dmesg에서 널 포인터 역참조 오류를 읽었는데, 이는 open
NULL을 가리켰기 때문에 예상된 것입니다.
그러나 cat
GNU coreutils 명령은 작업을 수행하여 다음과 같은 출력을 제공합니다.
$ cat /proc/testfile
testoutput
cat
이는 함수가 호출되지 open
않고 직접 호출된다는 의미입니다 read
( write
이 역시 수행될 수 있음).
내 이해에 따르면 open()
파일을 처리하는 데 추가로 사용되는 파일 설명자가 반환되며 read()
계속하려면 파일 설명자가 필요합니다.
거기선 이게 어떻게 이루어지나요 cat
?
답변1
strace
다음을 사용하여 특정 명령이 수행하는 시스템 호출을 확인할 수 있습니다 .
$ strace cat /proc/version
[...]
openat(AT_FDCWD, "/proc/version", O_RDONLY) = 3
[...]
read(3, "Linux version 5.16.0-5-amd64 (de"..., 131072) = 181
write(1, "Linux version 5.16.0-5-amd64 (de"..., 181) = 181
[...]
$ strace python3 -c 'open("/proc/version")'
[...]
openat(AT_FDCWD, "/proc/version", O_RDONLY|O_CLOEXEC) = 3
[...]
Appart는 O_CLOEXEC
해당 플래그에 대한 문제와 관련이 없어야 하며 둘 다 내 시스템에서 정확히 동일한 시스템 호출을 수행합니다.