操作系统一切皆文件,访问文件实际上就是访问硬件,因为文件都保存在硬件上,或者文件就是硬件,而要访问硬件,就需要操作系统提供的系统调用,所以c/c++函数中关于访问硬件设备,基本上是由系统调用封装而成的。
一切皆文件的本质
每一个外设的io方法实际上是不一样的,为了达到一切皆文件这个要求,所以每个外设,不同的硬件都封装了读取和写入的驱动方法接口,每个文件的结构体对象struct_file都会保存着这个对应驱动方法的地址,这样就可以做到即使底层实现方法不同,但给出的接口是一致的,所以上层调用不关心底层怎么实现,调用的接口是一样的就做到了一切皆文件。
比特位级别的标志位传递方式
例:
#define one 001
#define two 010
#define three 100
这三个都是只有一个比特位的二进制数字
而每一个比特位在的位置都有对应的功能,每一个功能都会跟输入的数字进行与运算,001&one就是真如果输入one进去,那个那个比特位为001的功能就可以被使用,如果想一次性使用多个功能,那么输入参数的时候,将多个宏定义或运算就可以了
在操作系统中,为了管理打开的文件,会将这些文件的的属性组织成struct file结构体,这些结构体会组成链表 。tast_struct 结构体会保存一个结构体的指针,这个指针指向的结构体包含一个 指针数组,如果这个进程有打开的文件,那么就会把这个文件的指针填充到这个数组空着的位置,数组位置的选择,是从0开始,找到最小的位置填充进去。这个实际上就是文件描述符表,可以通过文件描述符表来找到打开的文件,而文件描述符就是这个数组中的下标,通过下标来找到文件指针。
而多个文件描述符可能指向同一个文件,那么就会有一个计数器count来表示指向该文件的数量。
关闭文件,关闭文件实际上是将指针数组当中下标对应的位置置空,并将指向的文件当中的引用计数count--,如果count为0,则释放该文件结构,不为零则不释放。
重定向指令
重定向指令默认是将1也就是显示器重定向,可以>前面加个数字,将该数字对应的文件重定向,也可以一次性重定向多个用空格分隔开就行
fopen
FILE* fopen(const char* path,const char* mode);
返回值是文件指针,如果失败返回null
第一个参数是文件路径,第二个参数是以什么方式打开文件
w 以覆盖写入方式打开文件,先将文件清空再写入
r 以读方式打开文件
a以追加写入方式打开文件
fwrite
第一个参数是要写入文件的字符串,第二个是输入的单位大小,第三个是单位数量,第四个是文件指针。
返回nmemb。
fread的返回值也是nmemb也就是单位个数
open
open是一个系统调用接口,第一个是文件路径,第二个参数是打开的模式,第三个参数是如果是以写方式打开,并且该文件不存在,允许自己设置该文件的权限。返回参数是一个整数,这个整数是一个文件描述符,这个文件描述符就是tast_struct里文件描述符表里文件指针数组保存的文件指针的下标。
打开模式选项
O_RDONLY 以读方式打开
O_WRONLY 以写方式打开
O_RDWR 以读写方式打开
O_CREAT 创建
O_APPEND 以追加方式打开
O_TRUNC 打开文件时清空
第三个参数:
用八进制来确定权限,和指令chmod一样例:
0666
write
fd是文件描述符
buf 是字符串指针
count 是写入多少
返回值是实际写入的个数
read
fd是文件描述符
buf 是字符串指针
count 读取多少
修改umask
关闭文件
重定向
重定向的本质是在文件描述符表上,进行内核级别的拷贝
dup2
dup2是一个输出重定向的系统调用,oldfd是覆盖的文件标识符,newfd是被覆盖的文件标识符。
dup2本质上是把一个文件标识符所对应的文件指针复制到文件标识符数组中另一个文件标识符所对应的下标。