Top > C言語 > read


リニューアル

サイトリニューアル中です。本ページは以下URLへ移動しました。
Prog.さな雑記

関数仕様

書式
すべてを展開すべてを収束
  1
  2
  3
 
 
 
#include <unistd.h>
 
ssize_t read (int fd, void *buf, size_t count);
引数
fd    : ファイル記述子
buf   : データを読み込むバッファの先頭アドレス
count : 読み込む最大バイト数
戻り値
正の値 : 読み込んだバイト数
     0 : ファイルオフセットがすでに EOF
    -1 : エラー

注意

read 関数は、引数countで指定したバイト数を必ず読み込んでくれるわけではない。
例えば、read 処理中にsignalなどの割り込みが発生した場合、 read は途中で中断されてしまう。
これらのケアを正しく行わないと、プログラムが破綻してしまう。
例えば、socket にアクセスする場合などは、最後まで読み出さなければならない。

サンプル

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
-
|
|
|
-
|
-
|
!
|
-
|
!
!
|
-
|
!
|
-
|
|
!
!
|
|
!
 
 
 
-
|
|
|
|
|
|
-
|
!
|
|
|
-
|
|
!
|
|
|
|
|
!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
 
#define LOG_FILE_PATH "./test.log"
 
static ssize_t
my_read (int fd, char *buf, size_t size)
{
  ssize_t done = 0;
  size_t s = size;
 
  while (s > 0)
    {
      done = read (fd, (void *)buf, s);
 
      if (done < 0)
        {
          if (errno == EINTR)   /* Interrupt */
            {
              continue;
            }
          else                  /* Error */
            {
              return done;
            }
        }
      else if (done == 0)       /* EOF */
        {
          return size - s;
        }
      else
        {
          buf += done;
          s -= done;
        }
    }
 
  return size;
}
 
int
main (void)
{
  int fd, size;
  char buf[128];
 
  fd = open (LOG_FILE_PATH, O_RDONLY);
 
  if (fd < 0)
    {
      return -1;
    }
 
  size = my_read (fd, buf, sizeof (buf));
  if (size != sizeof (buf))
    {
      close (fd);
      return -1;
    }
 
  /* 処理を書く */
 
  close (fd);
  return 0;
}

リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sun, 10 Oct 2021 04:42:03 UTC (1075d)