Linux IO操作
迪丽瓦拉
2025-05-30 08:46:04
0

文章目录

  • 1 系统IO
    • 1.1 文件描述符
    • 1.2 open、close函数
      • 1.2.1 open函数
      • 1.2.2 close
    • 1.3 read_write函数
      • 1.3.1 write函数
      • 1.3.2 read函数
    • 1.4 lseek和sync函数
      • 1.4.1 lseek函数
      • 1.4.2 sync函数
  • 2 标准IO

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 
#include 
#incude 

函数原型

  • 当文件存在时
int open(const char* pathname,int flags)
  • 当文件不存在时
int open(const char* pathname,int flags,int perms)

返回值:

  • 成功:文件描述符
  • 失败:-1

1.2.2 close

包含的头文件

#include 

函数原型

int close(int fd);

返回值

  • 成功:0
  • 失败:-1

1.3 read_write函数

1.3.1 write函数

包含的头文件

#include 

函数原型

ssize_t read(int fd,void*buff,size_t count);

返回值
成功:

  • count:全部写入
  • 0~count:被异步信号打断
    失败
    -1

1.3.2 read函数

包含的头文件

#include 

函数原型

ssize_t read(int fd,void*buff,size_t count);

返回值

成功:

  • count:全部读取
  • 0~count:剩余文件长度小于count、被异步信号打断
    失败
    -1

复制一个文件到另一个文件

#include 
#include 
#include 
#include 
#include 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 

函数原型

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 

函数原型

void sync(void);

Linux具有页缓存机制,在用户与磁盘之间会有一个页缓存区,当写数据后并不会立即写入磁盘,需要等待页缓存区满了以后才会一起送入磁盘,使用sync函数可以将页缓存区的数据立即写入磁盘。

2 标准IO

C标准库实现了一个IO缓冲区

常见标准IO函数

  • fopen
  • fclose
  • fwrite
  • fread
  • fseek
  • fflush
    使用方法与系统IO方式类似
    在这里插入图片描述

文件IO5大模式

  • 阻塞模式
  • 非阻塞模式
  • IO多路复用
  • 异步IO
  • 信号驱动IO

相关内容