リニューアル
サイトリニューアル中です。本ページは以下URLへ移動しました。
Prog.さな雑記
関数仕様
- 書式
-
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!!");
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;
}
|