server-api-write

原型

向打开的文件写入数据,将用户数据保存到文件中。
当操作的对象是普通文件时,写文件的位置从文件的当前开始,操作成功后,写的位置会增加写入字节数。如果在打开文件的时候指定了O_APPEND项,每次写操作之前,会将写操作的位置移到文件的结尾处。
写操作的返回值与想写入的字节数会存在差异,与read函数的原因类型,因此建议做条件判断。

1
2
3
4
5
6
7
8
// 用write()系统调用将数据写到一个文件中
// fd:要写入的文件的文件描述符
// buf:指向内存块的指针,从这个内存中读取数据写入到文件中
// count:要写入文件的字节个数
// 返回值:
// 如果出现错误,返回-1
// 如果写入成功,则返回写入到文件中的字节个数
ssize_t write(int fd, const void* buf, size_t count);

使用参考

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>

#define BUFSIZE 1024
#define SUCCESS 0
#define FAILURE -1

// 写入文件
// @fd:要写入的文件描述符
// @buf:要写入的内容
// @nbytes:要写内容数量
int write_to_file(int fd, const char* buf, const size_t nbytes){
size_t left = nbytes;
size_t written_len = 0;
const char* p_tmp = buf;

while(left > 0){
written_len = write(fd, p_tmp, left);

if(written_len < 0){
written_len = -errno;

if(written_len == EINTR || written_len == EAGAIN){
// 软中断之类的
continue;
}

if(written_len == EBADF){
// 文件出问题了
break;
}

fprintf(stderr, "write failed, reason:%s\n", strerror(errno));
return FAILURE;
} else if(0 == written_len){
// 文件写入失败
break;
}

left -= written_len;
p_tmp += written_len;
}

if(0 != left){
return FAILURE;
}

return SUCCESS;
}

int main(int argc, char** argv){
int fd = 0;
fd = open("./test.txt", O_RDWR | O_CREAT, S_IRWXU | S_IRGRP | S_IROTH);

if(-1 == fd){
fprintf(stderr, "open failed, reason:%s\n", strerror(errno));
exit(-1);
}

off_t size = lseek(fd, 0, SEEK_END);
char buf[BUFSIZE];
int ret = 0;
int i = 0;

memset(buf, '8', BUFSIZE);

for(i = 0; i < 10; ++i){
ret = write_to_file(fd, buf, BUFSIZE);
if(FAILURE == ret){
break;
}
}

close(fd);
return 0;
}