基础IO(熟悉open/read/write/close,纵向对比fd与FILE结构体)

一、熟悉open/read/write/close函数

1.open函数

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

pathname:要打开或创建的目标文件
flags:打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读,写打开
这三个常量,必须指定且只能指定一个
O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND:追加写
返回值:
成功:新打开的文件描述符
失败:-1
基础IO(熟悉open/read/write/close,纵向对比fd与FILE结构体)_第1张图片

2.read函数

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

函数说明:是从fd所描述的打开文件中读取buf所指缓冲区中的n个字节。
参数:
fd:文件描述符,用来指向要操作的文件的文件结构体。
buf:一块内存空间。
count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读取位置向后移。
ssize_t:有符号整型。
返回值:
成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0。
**注意:**读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读的字数。

3.write函数

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

函数说明:将 buf所指向的缓冲区的 n字节写入 fd 所描述的打开文件中 。
参数:
fd:文件指针
buf:写入的数据保存在缓冲区buf中,同时文件的当前读写位置向后移
count:请求写入的字节数。
返回值:
成功返回写入的字节数,出错返回-1并设置errno写常规文件时,write的返回值通常等于请求写的字节数count,而向终端或者网络写则不一定。

4.close函数

基础IO(熟悉open/read/write/close,纵向对比fd与FILE结构体)_第2张图片
注意:关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,它所有的打开文件都由内核自动关闭。

二、对比fd与FILE结构体

1.文件描述符
对于Linux而言,所有对设备(一切皆文件)和文件的操作都是使用文件描述符来进行的。
文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表。
当打开一个现存文件或者创建一个新文件时,内核就向进程返回一个文件描述符用于后续对文件的读写操作,当需要读写文件时,也需要将文件描述符作为参数传递给相应的函数。
0&1&2
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2.
0,1,2对应的物理设备一般是:键盘,显示器,显示器
本质:fd本质其实就是一个表示数组下标的小整数。
文件描述符的分配规则
在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。
2.FILE
FILE结构体中的成员
缓冲区基址、缓冲区当前指针、缓冲区大小、缓冲区剩余字节数、文件读写方式等。

struct FILE
{
    char *_ptr;//文件输入的下一个位置
    int _cnt;//当前缓冲区的相对位置
    char *_base;//指基础位置(文件的起始位置)
    int _flag;//文件标志
    int _file;//文件的有效性验证
    int _charbuf;//检查缓冲区状况,如果缓冲区则不读取
    int _bufsiz;//文件的大小
    char *_tmpfname;//临时文件名
};

(FILE*)文件指针
文件指针指向进程用户区中一个被叫做FILE结构的结构数据。FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
区别:
fd是一个表示数组下标的整数,在打开文件的过程中,起到一个索引的作用,进程通过PCB中的文件描述符找到所指向的文件指针file*。
文件描述符的操作(如:open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表,此表中的文件描述符来引用。
流(如:fopen)返回的是一个文件指针(即指向FILE结构体的指针),FILE结构是包含有文件描述符的,fopen可以看做是open(fd直接操作的系统调用)的封装。
文件描述符(fd)是唯一的,文件指针(FILE)不是唯一的,但指向的对象也应该是唯一的。

你可能感兴趣的:(基础IO(熟悉open/read/write/close,纵向对比fd与FILE结构体))