Top > C言語 > write


関数仕様

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

注意

write は read とは異なり、戻り値が示す書き込んだバイト数が、 countで指定したバイト数よりも小さくなることは殆どない。
しかし、write で書き込んだ内容がスグにDiskや外部ストレージに反映されるわけではない。 write で書き込んだ内容は、一旦カーネルのバッファへ 格納され、カーネルが暇な時に実際に書き込まれる。書き込んだ後に読み出しても、 実際に参照している先はカーネルのバッファになるため、実際に書き込まれたかどうかを 確認するのは困難である。また、書き込まれるタイミングを知ることも困難である。 この問題を回避するために、sync() や fsync() という関数がある。 sync() を呼び出すと、バッファキャッシュ中の更新されたデータがディスクに書き込まれる

サンプル

すべてを展開すべてを収束
  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
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
-
|
|
-
|
|
|
|
!
|
!
|
!
 
 
 
-
|
|
|
|
|
|
-
|
!
|
|
|
|
|
|
-
|
|
!
|
|
-
|
|
!
|
|
|
!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
 
#define LOG_FILE_PATH "./log.dat"
 
int
my_write (int fd, void *buf, int size)
{
  int count = 0;
  char *buffer = buf;
  char *endp = buf + size;
 
  while (buffer < endp)
    {
      count = write (fd, buffer, endp - buffer)
      if (count < 0)
        {
          if (errno == EINTR)
            continue;
          else
            return -1;
        }
      buffer += count;
    }
  return size;
}
 
int
main (void)
{
  int fd, size;
  char buf[128];
 
  fd = open (LOG_FILE_PATH, (O_RDWR | O_CREAT), 0664);
 
  if (fd < 0)
    {
      return -1;
    }
 
  sprintf (buf, "Hello world!!");
 
  /* Force write 128 bytes */
  size = my_writet (fd, buf, sizeof (buf));
  if (size != sizeof (buf))
    {
      close (fd);
      return -1;
    }
 
  if (fsync (fd) < 0)
    {
      close (fd);
      return -1;
    }
 
  close (fd);
  return 0;
}

リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Fri, 13 May 2011 00:11:35 JST (2294d)