C のファイル記述子

Waqar Aslam 2023年10月12日
  1. ファイル記述子の概要
  2. C プログラミング言語のファイル記述子
  3. C のファイル記述子を使用したシステム コール
C のファイル記述子

この記事では、C プログラミング言語のファイル記述子について説明します。

ファイル記述子の概要

ファイル記述子は、コンピュータのオペレーティング システムで開いているファイルを一意に識別するために使用できる番号です。 データ リソースと、それにアクセスするために使用できるメソッドについて説明します。

ファイル記述子は、openclosereadwrite など、ファイルにアクセスするためのいくつかのメソッドを提供します。 ファイル記述子は、最も基本的な形式の整数です。

開かれた各ファイルには、その番号が付けられます。 これをファイル記述子と呼びます。

ファイル記述子は、ファイルを開くために使用された後、open() 関数によって返されるものです。 それが完了したら、このファイル記述子を使用して、そのファイルに対してさらにアクションを実行できます。

たとえば、開いているファイルからデータを読み取りたい場合は、データを読み取る関数への入力としてファイル記述子を提供します。

ファイル テーブル エントリ: プロセスがファイルを開くことを要求すると、ファイル テーブル エントリは、開いているファイルのプロキシとして機能するメモリ内の構造として形成されます。 これらのエントリは、ファイルの場所を維持する役割を果たします。

C プログラミング言語のファイル記述子

標準入力 (STDIN)、標準出力 (STDOUT)、および標準エラー (STDERR) は、Unix に似たオペレーティング システムでデフォルトで使用される最初の 3つのファイル記述子です。

プロセスが開始されると、そのプロセスのファイル記述子テーブルが自動的に開き、fd (ファイル記述子) 01、および 2 エントリが表示されます。 これら 3つの fd はそれぞれ、/dev/tty というファイルのファイル テーブル内の項目を参照します。

名前 ファイル記述子 説明
stdin 0 標準入力
stdout 1 標準出力
stderr 2 標準誤差

C のファイル記述子を使用したシステム コール

システム コールは、オペレーティング システムがアプリケーション プログラミング インターフェイス (API) を介してユーザー アプリケーションからそのサービスにアクセスできるようにする方法です。

このコンテキストでは、次のタイプの I/O システム コールが使用されます。

ファイル記述子を使用した open() 呼び出し

開きたいファイルの名前は、このメソッドの最初のパラメーターとして送信されます。 その後、オープニングモードを決定するためのオプションをいくつか提供します。

ファイルを開くことができない場合、戻り値は -1 に設定されます。 したがって、開いたファイルに対してこれ以上のアクティビティを実行する前に、open() メソッドによって返される値を確認する必要があります。

値が -1 の場合、open() メソッドがファイルを正常に開けなかったことがわかります。

open() 呼び出しを実装する例を見てみましょう。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_CREAT | O_RDONLY)) == -1) {
    printf("File Open Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);
  }
}

出力:

File Opened Successfully
File Descriptor: 3

main 関数の最初に、fileDescriptor という名前の整数変数が定義されています。 これは、ファイル記述子の値を格納するために使用されます。

その後、if ステートメントを使用して、open 関数によって返された値をテストしました。 -1 の場合、アプリケーションを終了し、エラー メッセージを表示します。

そうでない場合は、プログラムを続行できます。 文字列 abc.txt は、open 関数への最初の入力として送信されます。

これは、保存されているファイルの実際の名前です。 次に、O_RDONLY を使用する必要があることを示しました。

これは、ファイルを読み取り専用モードで開くことを示しています。 また、ファイルが存在しない場合は、O_CREAT を使用してファイルを作成する必要があります。

以下は、使用できるその他の引数です。

  1. O_WRONLY: ファイルが開き、書き込みのみが可能になります。
  2. O_RDWR: このオプションを使用すると、ファイルを同時に開いて読み書きすることができます。

ファイル記述子を使用した close() 呼び出し

ファイルシステムへのアクセスを停止するためです。 プログラムがこのシステム関数を呼び出すと、ファイルが不要になったことを示します。

その結果、バッファがフラッシュされ、ファイル情報が変更され、ファイルに関連付けられたリソースが割り当て解除されます。

int close(int fd);

ファイル記述子を使用した read() 呼び出し

ファイル記述子は、受け入れる最初のパラメーターです。 引数として、ファイルが開かれたときに使用された記述子を提供する必要があります。

2 番目のパラメーターとしてポインターが送信されます。 Read 関数は、指定されたファイルからデータを取得し、指定した場所に保存します。

このポインターの値として、以前に割り当てられたバッファー領域のアドレスを指定できます。 3 番目のパラメーターは、ファイルから読み取る必要があるバイト数を指定します。

ファイルが正常に読み取られた場合、このファイルから正常に読み取られたバイト数がこのファイルによって返されます。 成功しなかった場合、値 -1 を返します。

構文:

ssize_t read(int fd, void *buf, size_t count);

ファイル記述子を使用してファイルを読み取る例は次のとおりです。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_RDONLY)) == -1) {
    printf("File Opening Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);

    if (read(fileDescriptor, buff, sizeof(buff)) == -1) {
      printf("Error while reading file\n");
      exit(0);
    } else {
      printf("Text of the File: %s\n", buff);
    }
  }
  return 0;
}

出力:

File Opened Successfully
File Descriptor: 3
Text of the File: DelftStack has the solutions to all the programming-related problems
著者: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

関連記事 - C File