open/read/write/close等文件系统调用接口说明

一.open/read/write/close等文件系统调用接口说明

1.open函数介绍:
这里写图片描述
参数介绍:
pathname:要打开或创建的目录文件。
flags:打开文件时,可以传入多个参数选项。
参数:

O_RONLY:只读打开。
O_WRONLY:只写打开。
O_RDWR:读写打开
前面三个常量,只能指定一个。
O_CREAT:若文件不存在,则创建它。需要用mode设置权限。
O_APPEND:追加写。
mode:当文件不存在,需要open创建文件,mode表示默认权限 ,否则使用两个参数的open 

返回值:
成功:返回新打开的文件描述符。
失败:返回-1。

文件权限标志:
这里写图片描述

这里写图片描述

文件权限标志也可以使用加权数字表示,这组数字被称为umask变量,它的类型是mode_t,是一个无符号八进制数。umask变量的定义方法如表:

这里写图片描述

2.read函数

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

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

注意:读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读的字数。

3.write函数

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

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

4.close函数

这里写图片描述

注释:
(1)函数说明:关闭指定文件
(2)参数解释:fd—文件描述符,用来指向要操作的文件的文件结构体
(3)返回值:若成功返回0,出错返回-1;

注意:关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,它所有的打开文件都由内核自动关闭。

二、对比fd与FILE结构体

1.文件描述符fd

概念:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1
标准错误(standard error)是 2。 
0,1,2对应的物理设备一一般是:键盘,显示器,显示器。

查看当前最大打开文件描述符数:
这里写图片描述

修改当前用户环境下的最大打开文件描述符数 (临时更改):
这里写图片描述

2.FILE结构体

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

3.(FILE*)文件指针

文件指针指向进程用户区中一个被叫做FILE结构的结构数据。 
FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引; 
因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

4.文件描述符与文件指针的区别

1)文件描述符fd只是一个非负整数,在open时产生,起到一个索引的作用
进程通过PCB中的文件描述符表找到该fd所指向的文件指针file。 
(2open函数返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表
所有打开的文件都将通过此表中的文件描述符来引用; 
(3)fopen函数返回的是一个文件指针(FILE*),FILE结构是包含有文件描述符的
fopen可以看做是open(fd直接操作的系统调用)的封装,它的优点是带有I/O缓存

纵向对比fd与FILE结构体 :

文件描述符(fd)
我们都知道在Linux下一切皆文件。当然设备也不例外,如果要对某个设备进行操作,就不得不打开此设备文件,打开文件就会获得该文件的文件描述符fd( file discriptor), 它就是一个很小的整数,每个进程在PCB中都有一个指针*files,指向一张表files_struct,表中包含一个指针数组,每个元素都是指向打开文件的指针。文件描述符就是这个表的索引,即为该数组的下标。
这里写图片描述
文件描述符分配规则:在 file_struct数组中,找到当前没有被使用的最小下标,作为一个新的文件描述符。
下面来举例证明:
这里写图片描述
这里写图片描述
当close(0)时,输出结果为fd:0。
分析图如下:
这里写图片描述
注意:一般情况下,file_struct数组下标的 0,1,2 分别被标准输入(键盘),标准输出(显示器),标准错误(显示器)占用,只有当调用close()函数,关闭掉某个下标 ,fd才会是0或1,或2.若没有被关闭的,fd会是3。
其次,由于数组下标没有负数,所以fd也不会是负数。
所以,通过上面的介绍,可以知道,fd的本质其实就是一个表示数组下标的小整数。

fopen 的操作
这里写图片描述
函数fopen()就是返回打开文件的指针;如果操作失败,返回空指针null。

稍后补充……….

猜你喜欢

转载自blog.csdn.net/fighthha/article/details/81157985