【Linux】文件基础、文件系统调用接口、文件描述符


目录

文件基础

系统调用接口

open

close

write

实现文件写入

实现文件内容追加

read

实现文件读取

文件描述符fd


文件基础

1.空文件,也要在磁盘占用空间。

2.文件=内容+属性

3.文件操作:是单独对于内容或属性、或者内容和属性

4.文件路径+文件名,标明了文件的唯一性

5.如果没有指明对应的文件路径,默认是在当前路径(当前进程所在路径)进行访问

6.对文件的操作本质是进程对文件的操作

7.一个文件要被访问,首先要被打开(用户进程用来调相应接口,操作系统帮我们把文件打开


系统调用接口


open

【Linux】文件基础、文件系统调用接口、文件描述符_第1张图片

pathname  文件名

flags  O_RDONLY(只读), O_WRONLY(只写)  O_RDWR(读写),O_CREAT(不存在就创建)这些是标记位的宏,用不同的比特位来标记不同的含义。

mode 权限,处理文件不存在的情况时,传入文件的处理权限

使用

【Linux】文件基础、文件系统调用接口、文件描述符_第2张图片

注意:这里运行的myfile算是shell的子进程,umask(0)改变的是这里myfile进程的umask,与shell中的umask无关。


close

使用


write

fd  文件描述符

buf  对应的缓冲区数据存储在buf中

count  要写入的字节个数

实现文件写入

【Linux】文件基础、文件系统调用接口、文件描述符_第3张图片

注意:C语言以'\0'作为字符串的结尾,这是c语言的规定与文件无关。文件不以'\0'位结尾,只要字符串里的有效内容,所以这里的strlen(Buffer)不用+1,除非要在文件内写入'\0'

实现文件内容追加


read

从文件描述符读取内容到*buf中,读取长度为count

ssize_t 是系统定制的一种类型,是有符号整数。

 如果read调用成功,会返回自己读到了多少字节,如果返回0,表示读到了文件结尾。ssize_t的值大于0就表示读取成功。

实现文件读取

【Linux】文件基础、文件系统调用接口、文件描述符_第4张图片


文件描述符fd

在进程打开文件时,一定会打开多种多样的文件,有n多个进程OS中一定有大量的被打开的文件,OS管理这些被打开的文件文件,每一个文件都有一个struct file{}对象

进程与文件,是要通过内核当中的文件描述符表,通过数组的方式,将进程和文件关联起来,所以得到的文件描述符都是连续的小整数就是数组下标。

C语言运行时会默认打开三个输入输出流

stdin 键盘    stdout  显示器   stderr  显示器,文件描述符0 1 2默认被这三个文件占用。

文件描述符的本质就是,数组的下标。

【Linux】文件基础、文件系统调用接口、文件描述符_第5张图片


最后

加油

【Linux】文件基础、文件系统调用接口、文件描述符_第6张图片

你可能感兴趣的:(Linux的蜕变之路,linux,文件,系统调用接口,学习,操作系统)