"cat"은 파일 설명자 없이 파일을 어떻게 읽나요?

"cat"은 파일 설명자 없이 파일을 어떻게 읽나요?

, , 및 같은 작업이 등록된 기능에 의해 처리되는 procfs가상 파일 시스템을 활용하는 Linux에 대해 배우고 있습니다 .openreadwriterelease

다음과 같은 Python 코드를 사용하여 파일의 내용을 읽으려고 할 때 실수로 open및 를 null 포인터로 남겼습니다 .release

with open("/proc/testfile", "r") as f:
    content = f.read()

프로그램이 멈추고 커널 dmesg에서 널 포인터 역참조 오류를 읽었는데, 이는 openNULL을 가리켰기 때문에 예상된 것입니다.

그러나 catGNU 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해당 플래그에 대한 문제와 관련이 없어야 하며 둘 다 내 시스템에서 정확히 동일한 시스템 호출을 수행합니다.

관련 정보