文章目录
Linux系统下的IO操作分为系统IO和标准IO
系统IO为Linux系统内核提供的API、标准IO为C语言在Linux操作系统下的API
1 系统IO
- open(filename,flags,mode)
- write(fd,buff,write_len)
- read(fd,buff,read_len)
- lseek(fd,offset,whence)
- close(fd)
int fd;
fd = open(filename);
lseek(fd,offset,whence);
write(fd,buff,write_len);
read(fd,buff,read_len);
close(fd);
1.1 文件描述符
特殊的索引
实际上是Linux系统下进程的file_struct结构体下的file_array数组下标,数组成员为file_operation操作结构体。
模式
主模式:
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:可读可写模式
副模式 - O_CREAT:新建模式
- O_APPEND:追加模式
- O_DIRECT:直接IO模式
- O_SYNC:同步模式
- O_NOBLOCK:非阻塞模式
主模式只能有一个
副模式可以使用 | 运算符指定多个
1.2 open、close函数
1.2.1 open函数
包含的头文件
#include <sys/types.h>
#include <sys/stat.h>
#incude <fcntl.h>
函数原型
- 当文件存在时
int open(const char* pathname,int flags)
- 当文件不存在时
int open(const char* pathname,int flags,int perms)
返回值:
- 成功:文件描述符
- 失败:-1
1.2.2 close
包含的头文件
#include <unistd.h>
函数原型
int close(int fd);
返回值
- 成功:0
- 失败:-1
1.3 read_write函数
1.3.1 write函数
包含的头文件
#include <unistd.h>
函数原型
ssize_t read(int fd,void*buff,size_t count);
返回值
成功:
- count:全部写入
- 0~count:被异步信号打断
失败
-1
1.3.2 read函数
包含的头文件
#include <unistd.h>
函数原型
ssize_t read(int fd,void*buff,size_t count);
返回值
成功:
- count:全部读取
- 0~count:剩余文件长度小于count、被异步信号打断
失败
-1
复制一个文件到另一个文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main(int argc,char **argv)
{
char buf[512];
int read_size=0;
int fd1,fd2;
fd1 = open(argv[1],O_RDONLY);
fd2 = open(argv[2],O_WRONLY|O_CREAT,0666);
if(argc != 3)
{
printf("param error!!!");
return -1;
}
if(fd1<0 ||fd2<0)
{
printf("open error!!!");
return -1;
}
while(1)
{
read_size = read(fd1,buf,512);
if(read_size<0)
break;
write(fd2,buf,read_size);
}
close(fd1);
close(fd2);
return 0;
}
main函数规定有两个参数
int main(int argc,char** argv)
- argc表示main函数参数的个数
- argv表示实际的形参
如果一个程序名为main,调用该程序>main arg1 arg2,则argc=3,因为第一个参数是main这个程序本身
1.4 lseek和sync函数
1.4.1 lseek函数
需要的的头文件
#include <unistd.h>
函数原型
off_t lseek(int fd,off_t offset,int whence);
- 若whence为SEEK_SET则基准点为文件起始位置
- 若whence为SEEK_CUR则基准点为文件当前位置
- 若whence为SEEK_END则基准点为文件末尾
offset为偏移量
返回值
成功:文件偏移位置值
失败:-1
1.4.2 sync函数
头文件
#include <unistd.h>
函数原型
void sync(void);
Linux具有页缓存机制,在用户与磁盘之间会有一个页缓存区,当写数据后并不会立即写入磁盘,需要等待页缓存区满了以后才会一起送入磁盘,使用sync函数可以将页缓存区的数据立即写入磁盘。
2 标准IO
C标准库实现了一个IO缓冲区
常见标准IO函数
- fopen
- fclose
- fwrite
- fread
- fseek
- fflush
使用方法与系统IO方式类似
文件IO5大模式
- 阻塞模式
- 非阻塞模式
- IO多路复用
- 异步IO
- 信号驱动IO