Linux基础——文件I/O(open、read、write的使用)

1、Linux下文件的概念

  1. 什么是文件
    在Linux系统中,普通文件、目录、设备、套接字都是文件。
  2. 文件缓冲区
    每一个FILE文件流都有一个缓冲区Buffer,默认大小为8192Byte
  3. 文件描述符
    一个进程被创建默认打开3个文件操作符分,这三个文件操作符就可以对进程正常操作,他们分别是
    标准输入:STDIN_FILENO 0
    标准输出:STDOUT_FILENO 1
    标准错误:STDERR_FILENO 2

2、open函数

  • 新打开文件返回文件描述符表中未使用的最小文件描述符。
  • open函数可以打开或创建一个文件。

需要的头文件

#include <sys/types.h>
#include <sys/stat.h> 
#include <fcntl.h>

函数

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode); 

参数:
     pathname:文件名称,可以包含(绝对和相对)路径
     flag:文件打开模式
     mode:比如0644表示-rw-r-r

flag 作用
O_CREAT 创建文件
O_EXCL 创建文件时,如果文件存在则出错返回
O_TRUNC 把文件截断成0
O_RDONLY 只读(互斥)
O_WRONLY 只写(互斥)
O_RDWR 读写(互斥)
O_APPEND 追加,移动文件读写指针位置到文件末尾
O_NONBLOCK 非阻塞标志
O_SYNC 使每次write都等到物理I/O操作完成,包括文件属性的更新

返回值:成功返回新分配的文件描述符,出错返回-1并设置errno

flag值注意:

  • O_RDONLY 只读
  • O_WRONLY 只写
  • O_RDWR 读写

上面三者必须写一个(只能写一个),以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags参数(比如O_RDONLY|O_CREAT)

  • O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾 而不覆盖原来的内容。
  • O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode,表示该 文件的访问权限。
  • O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
  • O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。
  • O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O(Nonblock I/ O)

read函数

头文件
#include <unistd.h>

函数
ssize_t read(int fd, void *buf, size_t count);

参数:

  • fd:要操作的文件操作符
  • *buf:读到的数据保存于此
  • count:读取字节数

返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。

函数原理:read函数读上来的数据保存在缓冲区buf中,同时文件的当前读 写位置向后移。

write函数

头文件:
#include <unistd.h>

函数:
ssize_t write(int fd, const void *buf, size_t count);

参数:

  • fd:要写入的文件操作符
  • *buf:要写入的数据将从此获取
  • count:要写入的字节数

返回值:成功返回写入的字节数,出错返回-1并设置errno

猜你喜欢

转载自blog.csdn.net/l1206715877/article/details/107760703