linux应用进化之路-文件IO
Linux中设备的访问也以一切皆文件的思想存在,所以文件I/O是最常用的接口。
头文件
#include <sys/types.h>
include <sys/stat.h>
include <fcntl.h>
open函数
int open(const char *pathname, int flags);
参数:
pathname:欲打开的文件路径名
flags:文件打开方式。O_RDONLY|O_WRONLY|O_RDWR
返回值:
成功返回新分配的文件描述符,出错返回-1并设置errno
int open(const char *pathname, int flags, mode_t mode);
参数:
pathname:欲打开的文件路径名
flags:文件打开方式。O_RDONLY|O_WRONLY|O_RDWR
返回值:
成功返回新分配的文件描述符,出错返回-1并设置errno
close函数
include <unistd.h>
int close(int fd);
参数:
fd:打开文件的文件描述符
返回值:
成功返回0,出错返回-1并设置errno
read函数
include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:需要读取文件的文件描述符。
buf:存放读写内容的空间。
count:需要读写的大小。
返回值:
成功返回读取的数据大小,返回0读到文件末尾。
出错返回-1并设置errno。
如果errno=EAGIN或EWOULDBLOCK,说明不是read失败,而是read在
以非阻塞方式读一个设备文件(网络文件),并且文件无数据返回。
阻塞与非阻塞
是设备文件、网络文件的属性。
产生阻塞的场景,读设备文件,读网络文件。(读常规文件无阻塞概念)
/dev/tty --终端文件。
open("/dev/tty", O_RDWR|O_NONBLOCK) --- 设置/dev/tty非阻塞状态(默认阻塞)
write函数
include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
参数:
fd:需要写入文件的文件描述符。
buf:存放写入内容的空间。
count:需要写入内容的大小。
返回值:
成功返回写入的数据大小。
出错返回-1并设置errno。
fcntl函数
include <unistd.h>
include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
参数:
fd:文件描述符。
cmd:1.获取文件状态F_GETFL
2.设置文件状态F_SETFL
返回值:
成功返回写入的数据大小。
出错返回-1并设置errno。
lseek函数
include <sys/types.h>
include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数:
fd:文件描述符。
offset:偏移量
whence:起始偏移位置。SEEK_SET / SEEK_CUR /SEEK_END
返回值:
成功返回较起始位置偏移量。
出错返回-1并设置errno。
应用场景
1、文件的”读“,”写“使用同一偏移位置。
2、使用lseek获取,文件大小。
3、拓展文件大小。要想使文件大小真正拓展,必须引起IO操作。
(使用truncate函数,可以直接拓展文件大小)
注意:lseek函数返回的偏移量总是相对于文件头而言。
传入参数:
1.指针作为函数参数;
2.通常有cont关键字修饰;
3.指针指向有效区域,在函数内部做读操作。
传出参数:
1.指针作为函数参数;
2.在函数调用之前,指针指向的空间可以无意义,但必须有效。
3.在函数内部,做写操作;
4.在函数调用结束后,充当函数返回值。
传入传出参数:
1.指针作为函数参数;
2.在函数调用之前,指针指向的空间有意义。
3.在函数内部,先做读操作,后做写操作。
4.在函数调用结束后,充当函数返回值。

浙公网安备 33010602011771号