ファイルの読み取り

このセクションでは read サブルーチンについて説明します。

ファイルの読み取り

サブルーチン 説明
読み取り オープン・ファイルから指定されたバッファーへ指定されたバイト数をコピーするサブルーチン。 コピーは、 現在のオフセットによって示されたポイントから開始します。 バイト数およびバッファー数は NBytes および Buffer パラメーターによって指定します。

read サブルーチンは次のことを行います。

  1. FileDescriptor パラメーターが有効であり、プロセスが read アクセス権を持っていることを確認します。 次に、サブルーチンは、 FileDescriptor パラメーターによって指定されたファイル・テーブル・エントリーを獲得します。
  2. 読み取り操作が進行中であることを示すフラグをファイル内に設定します。 このアクションによって、操作中は、他のプロセスに対し、このファイルがロックされます。
  3. オフセット・バイト値と NBytes 変数の値をブロック・アドレスに変換します。
  4. 識別されたブロックの内容をストレージ・バッファーに転送します。
  5. ストレージ・バッファーの内容を、 Buffer 変数によって指定された領域にコピーします。
  6. 実際に読み取られたバイト数に従って、現在のオフセットを更新します。 オフセットのリセットによって、次の読み取りプロセスは必ずデータを順次に読み取るようになります。
  7. NByte 変数に指定されている合計から、読み取ったバイト数を差し引きます。
  8. 読み取るべきバイト数に到達するまでループします。
  9. 読み取った合計バイト数を戻します。

プロセスの実行中に、読み取るファイルが空になるか、 要求されたバイト数に到達するか、 または読み取りエラーが検出されると、サイクルは完了します。

読み取りループ内の余分の反復を避けるには、読み取り要求をデータ・ブロック境界の先頭から開始し、 データ・ブロック・サイズの倍数にしてください。 プロセスがブロックを順次に読み取ると、オペレーティング・システムは、 以後のすべての読み取りも順次であると想定します。

読み取り操作中は、i ノードがロックされます。 読み取りが進行中は、 その他のプロセスは、ファイルの内容の変更を許可されません。 ただし、 読み取り操作が完了するとすぐに、ファイルのロックは解除されます。 2 回の読み取り操作の間に、 別のプロセスがファイルを変更すると、結果のデータは異なりますが、 データ構造体の保全性は維持されます。

以下の例は、read サブルーチンを使用して、 foo ファイル内の null バイト数をカウントする方法を示しています。
#include <fcntl.h>
#include <sys/param.h>

main()
{
        int fd;
        int nbytes;
        int nnulls;
        int i;
        char buf[PAGESIZE];      /*A convenient buffer size*/
        nnulls=0;
        if ((fd = open("foo",O_RDONLY)) < 0)
                exit();
        while ((nbytes = read(fd,buf,sizeof(buf))) > 0)
                for (i = 0; i < nbytes; i++)
                        if (buf[i] == '\0';
                                  nnulls++;
        printf("%d nulls found\n", nnulls);
}