なぜod(1)がUNIXで機能していたのに、GNU/Linuxでは機能しないのか疑問に思いました。 serverfault に良い答えがあります。次の質問は、GNU/Linuxでのディレクトリデータのダンプをサポートするためにodの動作をエミュレートできるツールを知っていますか?
Linuxでは、単純なread(dir_name, buffer, sizeof(buffer)
を実行できません。常に-1を返し、EISDIRをerrno
に配置します。すべてのファイルシステムがファイルとしてディレクトリを持っているわけではないので、これはおそらく合理的です。たとえば、一般的に使用されるreiserfsはそうではありません。
Cプログラムからのopen()
システムコールを使用してディレクトリのファイル記述子を取得できますが、readdir(3)
(libcから)のようなものは実際にはgetdents(2)
を呼び出しますディレクトリエントリを取得します。ファイルシステムがディレクトリエントリを格納するために使用するもの(ファイル、データベース、ディスク上のBツリー)からstruct linux_dirent
を作成するために、各ファイルシステム実装におそらくコードがあります。