リニューアル
サイトリニューアル中です。本ページは以下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)
{
continue;
}
else
{
return done;
}
}
else if (done == 0)
{
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;
}
|