在Windows系统下,我们写一个文档的时候,一般通过打开/创建文档,编辑文档,保存文档,关闭文档实现,在Linux系统下,基本上也是这样的步骤,系统为我们提供了几个接口函数来实现:open(),write(),read(),lseek(),close()。下面来看这几个函数的用法。
1、open()
在终端中输入man 2 open,可以看到
在NAME中可以看到,有3个名字,在SYNOPSIS中,前三个头文件就是我们在使用open函数时需要添加的,再往下看,open函数有两个函数重载,第一个有两个参数,第一个参数是一个常量指针,也就是一个字符串,指向文件的地址,第二个参数是打开文件的方式,一般有O_RDONLY只读打开,O_WRONLY只写打开,O_RDWR可读可写打开,然后下面是可选的参数。
O_CREAT:若文件不存在则创建它,若使用这个参数,则应使用第二个重载,指明文件的许可权限。
O_EXCL:一般和O_CREAT一起使用,若文件已经存在,则不会打开文件,并且返回一个错误。
O_APPEND:每次写时都加到文件的尾端。
O_TRUNC:打开文件时,如果文件中本来是有内容的,而且为只读或只写打开,则其长度截断为0。也就是将原先东西全部删除。
最后参数mode就是在文件不存在时,创建文件时文件的权限。
creat()就是创建文件,参数参考上面。
openat()和open()区别如下:
(1) path参数指定的是绝对路径名,在这种情况下,fd参数被忽略,openat函数就相当于open函数。
(2) path参数指定的是相对路径名,fd+path就是完成路径名。
(3) path参数指定了相对路径名,fd参数写AT_FDCWD。在这种情况下,路径名在当前工作目录中获取。
我们可以看到open函数的返回值是int类型的,在使用时会给创建的文件一个ID,以方便在下面使用,若文件创建失败则返回-1。
2、write()
和上面一样,我们可以看到
使用时包含头文件,只有一个函数原型,
fd:打开的文件名,上面open函数的返回值
const void *buf:指向要写的内容的位置
count:写入的字节大小
返回值:写入字节的大小
如果返回-1,则写入失败。
3、read函数
我们直接来看函数原型
ssize_t read(int fd, void *buf, size_t count);
fd:同上
void *buf:指向读出的数据存放的位置
count:读的数据的字节数
返回值:实际读取的字节数
读取失败返回-1。
但是应当注意,如果读取之前,对文件进行过操作,需要对光标位置重新确定,设置在我们希望起始的位置。
4、lseek函数
函数原型为
off_t lseek(int fd, off_t offset, int whence);
fd:参考上面
offsert:相对whence的偏移值,可正可负
whence:有3个可选项
SEEK_SET:文件起始位置
SEEK_CUR:文件当前位置
SEEK_END:文件结尾
返回值:相对与起始位置的偏移量
出现错误,返回-1。