open() システムコールが呼び出されたときにカーネルで何が起こるか知りたいですか? ファイルのファイル記述子はどのように返されますか?
3 に答える
カーネルは、開いたばかりのファイルに関する追加情報を含む構造を内部的に作成します。この構造体inode
には、ファイル システム上のファイルの番号、名前、サイズ、関連付けられたスーパーブロックなどの情報が保持されます。
実際、カーネル内ではVFS (Virtual File System)
、ファイルの I/O 操作を処理するのは、ローカル (ハードディスク上) またはリモート (たとえば、FTP サーバー上にあるftpfs
) です。
GNU/Linux 上のすべてのファイル システムは、ファイルのオープン/読み取り/書き込み/クローズの同じメカニズムを実装しています。これにより、すべての開発者がアクセスしようとしているファイルの種類を気にする必要がなくなり、対話しているファイルの種類に関係なく、同じ open()、read() ... API を使用できます。VFSとは何かについての追加情報は、こことここにあります(IBM による優れた記事)。
最後に、let's say によって返される各ファイル記述子はopen
プログラムに関連しているため、最初に開く可能性のあるファイルはファイル記述子に関連付けられます3
...どのファイル記述子がバインドされているかを調べることができます経由の多くの GNU/Linux ディストリビューションの各プロセス/proc/{pid_of_your_process}
。
カーネル:
- ファイルを探します (ハード ドライブ、USB、名前付きパイプ、標準ストリームなど)
- すべてがうまくいった場合、ファイルを開いた記述子を保存します
- 記述子を返します
- close() またはプロセスが終了すると、open() に関する情報が解放されます