ファイルディスクリプタとtask_struct

最近、ファイルディスクリプタがなんなのかを知って、ちょっと面白く感じた。

ファイルディスクリプタは、ご存じだと思いますが、システムコールのopen()でファイルを開いたときに返ってくる、intの変数です。

これが何なのかというと、プロセスに関する情報を集めているtask_struct構造体のプロセスがオープンしたファイルの情報を管理する構造体files_structのfdtable構造体のfile構造体を保持する配列メンバfdのインデックス番号みたいです。

open()は、配列fdに空きがあるかをみて、引数で設定された情報をもとに、file構造体を作成し、配列fdにセットして、セットできたインデックス番号を返している(実際は、もっとなんかしているけど)。

そんなカーネル内部の情報とプロセス空間の情報が一致するか、配列で管理してるんだとか、なんかすげー単純だなぁというのが、ちょっとツボにはいりました。

これがわかって、dup2()とか、どんな感じで実装されているのかなぁとか想像できるようになって、楽しかったです。