目录
文件基础
系统调用接口
open
close
write
实现文件写入
实现文件内容追加
read
实现文件读取
文件描述符fd
文件基础
1.空文件,也要在磁盘占用空间。
2.文件=内容+属性
3.文件操作:是单独对于内容或属性、或者内容和属性
4.文件路径+文件名,标明了文件的唯一性
5.如果没有指明对应的文件路径,默认是在当前路径(当前进程所在路径)进行访问
6.对文件的操作本质是进程对文件的操作
7.一个文件要被访问,首先要被打开(用户进程用来调相应接口,操作系统帮我们把文件打开
系统调用接口
open
pathname 文件名
flags O_RDONLY(只读), O_WRONLY(只写) O_RDWR(读写),O_CREAT(不存在就创建)这些是标记位的宏,用不同的比特位来标记不同的含义。
mode 权限,处理文件不存在的情况时,传入文件的处理权限。
使用
注意:这里运行的myfile算是shell的子进程,umask(0)改变的是这里myfile进程的umask,与shell中的umask无关。
close
使用
write
fd 文件描述符
buf 对应的缓冲区数据存储在buf中
count 要写入的字节个数
实现文件写入
注意:C语言以'\0'作为字符串的结尾,这是c语言的规定与文件无关。文件不以'\0'位结尾,只要字符串里的有效内容,所以这里的strlen(Buffer)不用+1,除非要在文件内写入'\0'
实现文件内容追加
read
从文件描述符读取内容到*buf中,读取长度为count
ssize_t 是系统定制的一种类型,是有符号整数。
如果read调用成功,会返回自己读到了多少字节,如果返回0,表示读到了文件结尾。ssize_t的值大于0就表示读取成功。
实现文件读取
文件描述符fd
在进程打开文件时,一定会打开多种多样的文件,有n多个进程OS中一定有大量的被打开的文件,OS管理这些被打开的文件文件,每一个文件都有一个struct file{}对象
进程与文件,是要通过内核当中的文件描述符表,通过数组的方式,将进程和文件关联起来,所以得到的文件描述符都是连续的小整数就是数组下标。
C语言运行时会默认打开三个输入输出流
stdin 键盘 stdout 显示器 stderr 显示器,文件描述符0 1 2默认被这三个文件占用。
文件描述符的本质就是,数组的下标。
最后
加油