ファイルディスクリプタの詳しい解説でコンピュータシステムがよくわかる!
ファイル記述子は、コンピュータ システムで最も基本的で一般的に使用される概念の 1 つですが、初心者にとって理解するのは簡単ではないかもしれません。この記事では、ファイル記述子を包括的に分析し、原則、アプリケーション、実践の観点からファイル記述子がどのように機能するかを深く探ります。
ファイル記述子とは何ですか?
ファイル記述子は、入出力リソースに関連する整数であり、ファイル ハンドル、ファイル ポインタ、またはファイル参照と呼ばれることもあります。簡単に言えば、これは、I/O 操作を管理するためにオペレーティング システムによって維持されるテーブル内のインデックスであり、システムで開かれているファイルの「ハウス番号」を表します。
このテーブルはファイル記述子テーブルと呼ばれることが多く、各エントリは開いているファイルを記述し、ファイルの種類、読み取りおよび書き込みの場所、その他のステータス情報を含みます。ファイル記述子を通じてこれらの開いているファイルを参照し、ファイルの読み取りおよび書き込み操作を実行できます。
ファイル記述子の分類
Unix/Linux システムでは、ファイル記述子は通常、次の 3 つのカテゴリに分類されます。
- 標準入力 (STDIN_FILENO): デフォルトは 0 で、プログラムの標準入力ストリームを表します。
- 標準出力 (STDOUT_FILENO): デフォルトは 1 で、プログラムの標準出力ストリームを表します。
- 標準エラー (STDERR_FILENO): デフォルトは 2 で、プログラムの標準エラー出力ストリームを表します。
プログラムの実行中、プロセスの開始時にファイル記述子が継承されるため、ファイル記述子は通常、ファイルの読み取り、書き込み、出力の印刷などの I/O 操作を実行するために使用されます。
ファイル記述子の適用
- ファイル操作:
Unix/Linux システムでは、open() 関数を使用してファイルを開き、ファイル記述子を取得します。ファイルは read() および write() 関数を通じて読み書きでき、ファイル読み書きポインタは lseek() 関数を使用して移動でき、fcntl() 関数はファイル属性などの制御に使用されます。
- プロセス制御:
プロセス間の通信にはプロセス間通信メカニズム (IPC) を使用する必要があり、そのほとんどはファイル記述子に基づいています。たとえば、パイプはプロセス間の名前のないパイプ通信に使用でき、socketpair() はプロセスが通信できるように接続されたソケットのペアを作成できます。
- ネットワークプログラミング:
ネットワーク プログラミングでは、ソケット関数によって返されるソケット記述子はファイル記述子です。ファイル記述子、read() および write() 関数を通じて、ソケット ファイルにデータを書き込んだり、ソケット ファイルからデータを読み取ることができます。
ファイル記述子の実践
次のコードを考えてみましょう。
#include <stdio.h>
#include <fcntl.h>
int main()
{
int fd;
char c;
fd = open("file.txt", O_RDONLY); // 打开文件
while(read(fd, &c, 1) == 1) // 读文件内容到字符数组中
{
printf("%c", c); // 打印字符数组
}
close(fd); // 关闭文件
return 0;
}
このプログラムでは、ファイル「file.txt」を開き、ファイル記述子を取得して fd に保存します。次に、while ループを通じてファイルの各文字を反復処理し、read() 関数を使用して文字を文字配列に読み取り、printf() 関数を使用して出力します。最後に、close() 関数を使用してファイルを閉じます。
上記のコードを実行すると、ファイル「file.txt」の内容を出力して、ファイル記述子の正確さを証明できます。
要約する
この記事では、ファイル記述子の基本概念、その分類、アプリケーション、および実践方法を紹介します。ファイル記述子は、コンピュータ システムで最も基本的で一般的に使用される概念の 1 つであり、I/O 操作とプロセス通信を理解する上で非常に重要です。同時に、実際のプログラミングにおいては、ファイルディスクリプタの操作を習得することも非常に重要なスキルです。