、、などのタスクは、登録された機能によって処理されるprocfs
仮想ファイルシステムを利用するLinuxについて学んでいます。open
read
write
release
次のPythonコードを使用してファイルの内容を読み取ろうとしたときに、誤ってポインタをopen
nullポインタとして残しました。release
with open("/proc/testfile", "r") as f:
content = f.read()
プログラムがハングし、カーネルdmesgでNULLポインタの逆参照エラーを読み取ったのですが、これは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
そのフラグの問題に関連してはいけません。どちらも私のシステムでまったく同じシステムコールを実行します。