"cat"はファイル記述子なしでファイルをどのように読みますか?

"cat"はファイル記述子なしでファイルをどのように読みますか?

、、などのタスクは、登録された機能によって処理されるprocfs仮想ファイルシステムを利用するLinuxについて学んでいます。openreadwriterelease

次のPythonコードを使用してファイルの内容を読み取ろうとしたときに、誤ってポインタをopennullポインタとして残しました。release

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

プログラムがハングし、カーネルdmesgでNULLポインタの逆参照エラーを読み取ったのですが、これはopenNULLを指していたために予想されます。

ただし、catGNU coreutils コマンドは操作を実行し、次のような出力を提供します。

$ cat /proc/testfile
testoutput

catこれは、関数が呼び出されずにopen直接呼び出されることを意味しますreadwriteこれも実行できます)。

私の理解によると、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そのフラグの問題に関連してはいけません。どちらも私のシステムでまったく同じシステムコールを実行します。

関連情報