文件io
操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为系统调用 其中有个 文件IO
一般都是对设备文件操作,当然也可以对普通文件进行操作。
linux的文件IO机制
一个基于Linux内核的没有缓存的IO机制
特性:
1. 没有缓存区
2 .操作对象不在是流,而是文件描述符 FILE* int 0-1023
3.文件描述符
很小的非负的整数 int 0-1023
内核每打开一个文件就会获得一个文件 描述符
每个程序在启动的时候操作系统默认为其打开三个描述符与流对象匹配:
0 ==>STDIN_FILENO === stdin
1 ==>STDOUT_FILENO == stdout
2 ==>STDERR_FILENO == stderr
stdin,stdout,stderr,===>FILE*
头文件 unistd.h ===>POSIX 标准库 stdio.h
fopen open
w O_WRONLY|O_CREAT|O_TRUNC
w+ O_RDWR|O_CREAT|O_TRUNC
r O_RDONLY
r+ O_RDWR
a O_WRONLY|O_CREAT|O_APPEND
a+ O_RDWR|O_CREAT|O_APPEND
open
read /write
close
函数接口
open
open("1.c",O_WRONLY|O_CREAT,0666 );
int open(const char *pathname, int flags,int mode);
功能:获得一个文件描述符
参数:
pathname:文件名(文件的路径)
flags:表示文件打开的方式(使用一个或多个标志位的组合)
O_RDONLY 只读
O_WRONLY只写
O_RDWR读写
O_CREAT创建文件:如果文件不存在则创建文件,需要提供第三个参数mode
O_EXCL需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败
O_NOCTTY不是终端设备
O_TRUNC文件内容清空:如果文件存在,并且以写入方式打开,将其长度截断为0
O_APPEND追加:写入的数据将添加到文件末尾
O_ASYNC异步io,什么时候io不确定,
O_NONBLOCK非阻塞
返回值: 成功返回文件描述符 失败返回-1
write
char buf[50];
size_t write(int fd, const void *buf, size_t count);
功能:通过文件描述符向文件中写一串数据
参数:
fd:文件描述符
buf:要写入文件的字符串的首地址(填有效长度)
count:要写入字符的个数
返回值: 成功返回实际写入的个数 失败返回-1
read
ssize_t read(int fd, void *buf, size_t count);
功能:通过文件描述符读取文件中的数据
参数:
fd:文件描述符
buf:存放数据空间的首地址
count:要读到数据的个数
返回值: 成功返回读到数据的个数 失败返回-1 读到文件结尾返回0
lseek
fseek, rewind ftell
off_t lseek(int fd, off_t offset, int whence);
功能:定位光标的位置
参数:
fd:文件描述符
offset:偏移量
正:向后偏移
负:向前偏移
零:不偏移
whence:起始位置,决定了偏移量相对于哪个位置计算
SEEK_SET从文件的开头开始偏移
SEEK_CUR从当前位置开始偏移
SEEK_END从文件的末尾开始偏移
返回值: 成功返回偏移量 失败返回-1
eg:
lseek(fd,0,SEEK_END);将文件指针移动到文件的末尾
注意:
1、不支持O_APPEND的追加模式,无法生成空洞文件
2、lseek函数执行失败,文件指针还在偏移前的位置
3、lseek函数在设备文件上偏移无效
阻塞:在操作系统和并发编程中,阻塞指的是程序由于某些条件未满足(如等待输入/输出完成)而暂停执行,直到条件满足