Linux:初识IO流

文章目录

  • 前言
  • 一、C语言中的文件接口
  • 二、系统调用的文件操作接口
  • 三、文件描述符
  • 四、重定向


前言

下面将介绍一些基础IO流的相关知识,主要涉及c语言的文件接口,系统调用的文件操作接口,文件描述符(重点),重定向。

一、C语言中的文件接口

这是对C语言中的常用文件接口进行简单复习,有利于更好的认识io流,也是为接下来的知识做铺垫。
1.fopen函数
在这里插入图片描述
参数分析:
path表示待要打开的文件。
mode表示要以何种方式打开。打开方式的分类:
r:可读方式
r+:可读可写方式
w:可写方式
w+:可读可写方式,如果文件不存在,则创建文件,如果打开一个已经存在的文件,则截断文件(清空文件内容)
a:追加写,不能读,如果文件不存在,则创建文件,存在则在文件末尾开始追加写
a+:追加写,可以读,如果文件不存在,则创建文件,存在则在文件末尾开始追加写
返回值:打开文件成功则返回文件流指针 FILE,失败则返回NULL
2.fread函数
在这里插入图片描述
参数分析:
ptr:将从文件中读到的内容保存在ptr指向的空间中
size:定义读文件时,一个块的大小,单位为字节
nmemb:期望可以从文件中读多少块,size*nmemb相当于从文件中读多少字节
stream:表示文件流指针
返回值:返回真正读取到块的个数,常将块的大小size定义为1个字节,nmemb可以表示期望读多少字节,返回的含义就相当于读到了多少字节
3.fwrite函数
在这里插入图片描述
参数分析:
ptr:想往文件中写什么内容
size:定义写文件时,一个块的大小,单位为字节
nmemb:期望写多少块
stream:表示文件流指针
返回值:返回真正写到块的个数,常将块的大小size定义为1个字节,nmemb可以表示期望写入的字节数,返回的含义就相当于写入了多少字节
4.fseek函数
在这里插入图片描述
参数分析:
stream:表示文件流指针
offset:表示偏移量
whence:表示将文件流指针偏移到什么位置,whence通常有三种偏移量设置
SEEK_SET:定义文件流指针到文件头部
SEEK_CUR:定义文件流指针到当前位置
SEEK_END:定义文件流指针到文件尾部
5.fclose函数
在这里插入图片描述
关闭文件
例:
Linux:初识IO流_第1张图片
运行结果如下,如果不使用fseek函数重置文件流指针的位置,文件流指针是指向了写入内容的尾部,则读不出结果
在这里插入图片描述

二、系统调用的文件操作接口

1.open函数
当打开的文件存在时,调用以下接口在这里插入图片描述当打开的文件不存在时,调用以下接口在这里插入图片描述
参数分析:
pathname:表示待要打开的文件
flags:表示以何种方式打开
其中必选的打开方式三选一:
O_RDONLY:只读方式
O_WRONLY:只写方式
O_RDWR:读写方式
可选的打开方式:
O_TRUNC:截断文件(清空文件内容)
O_CREAT:文件不存在则创建文件
O_APPEND:追加的方式
O_EXCL | O_CREAT:如果文件存在,则打开文件失败
这些打开方式,是使用按位或的方式进行组合
如:O_RDWR | O_CREAT | O_APPEND
mode:表示打开文件时需要设置的权限,需要传递一个八进制数字
返回值:成功则返回文件描述符,失败返回-1
2.read函数
在这里插入图片描述
参数分析:
fd:文件描述符
buf:表示将内容读到buf所指向的空间中
count:期望读多少字节
返回值:返回读到的字节数量
3.write函数
在这里插入图片描述
参数分析:
fd:文件描述符
buf:表示将buf中的内容写到文件中去
count:期望写多少字节
返回值:返回写入的字节数量
4.lseek函数
在这里插入图片描述
fd:文件描述符
offset:表示偏移量
whence:表示将文件流指针偏移到什么位置,whence通常有三种偏移量设置
SEEK_SET:定义文件流指针到文件头部
SEEK_CUR:定义文件流指针到当前位置
SEEK_END:定义文件流指针到文件尾部
5.close函数
在这里插入图片描述
关闭文件描述符

三、文件描述符

1.认识文件描述符
当我们成功打开一个文件时,返回值是一个文件描述符,这个文件描述符是一个正整数.
从操作系统源码来看文件描述符,如下图:
Linux:初识IO流_第2张图片
操作系统所管理的task_struct结构体中有一个叫struct files_struct * files的结构体指针,这个结构体指针指向一个叫struct files_struct的结构体,结构体中有一个叫fd_array的数组,数组的每一个元素是结构体指针,指向一个描述文件具体信息的结构体。而文件描述符就是fd_array数组的下标,这也是文件描述符为什么是正整数的原因。其中,0,1,2分别表示标准输入,标准输出和标准错误,每个文件打开都会默认包含这三个文件描述符。
2.文件描述符的分配规则
最小未分配原则。正常情况下如果新打开一个文件,这个文件描述符是从0,1,2之后也就是从3开始分配,例:如果在打开之前关闭了0号标准输入,则新打开的文件描述符则被分配到0 ,1,2同理
3.文件流指针和文件描述符的区别
①文件描述符本质是数组的下标
②而c语言中fopen的返回值就是文件流指针,文件流指针的结构如下图:Linux:初识IO流_第3张图片文件流指针当中包含的读缓冲区和写缓冲区与exit和_exit函数刷新的缓冲区是一样的。
结论:文件流指针当中是包含文件描述符的,并且一个文件流指针中只能保存一个文件描述符

四、重定向

1.重定向的符号
①>:表示清空重定向
②>>:表示追加重定向
Linux:初识IO流_第4张图片
2.从文件描述符角度理解追加重定向
Linux:初识IO流_第5张图片
上图是文件描述符的结构,echo重定向是想要把我们在屏幕上输入的内容重定向到文件当中去。从文件描述符的角度,则是把标准输出的文件描述符1即struct file*的指向,从原来改成指向新文件。
3.重定向的接口(dup2函数)
在这里插入图片描述
oldfd:旧的文件描述符。
newfd:新的文件描述符。
例:想把“abc”重定向到3号文件描述符表示的文件当中,3号文件描述符就是oldfd,1号文件描述符就是newfd。实际是newfd拷贝oldfd的值,将newfd重定向为oldfd。调用成功则关闭newfd,让newfd指向oldfd。有两种情况会导致调用失败1.newfd和oldfd值相等,则dup2函数什么都不做2.oldfd是一个非法的文件描述符,或不存在文件描述符,则肚dup2函数调用失败,并且没有关闭newfd。

你可能感兴趣的:(Linux:初识IO流)