Linux|基础IO

回顾c语言的文件操作

#include<stdio.h>    
int main()    
{    
  FILE * fp = fopen("test.txt","w");    
  if(fp == NULL) return -1;
  fwrite(message,strlen(message),1,fp);    
  fclose(fp);    
    
  return 0;    
} 

我们我们以写的方式打开

  • 不存在则创建一个文件
  • 每次写入之前都会清空之前写的内容

提炼对文件的理解

  • 本质是进程打开文件,
  • 一个进程可以打开多个文件,进程和文件的关系是 1对多
  • 当文件没有被打开的时候在磁盘上
  • 文件等于属性+文件内容
  • 向磁盘中写入就是向外设,硬件中写入。用户没有权限直接写入,因为操作系统是软硬件的管理者,它提供了系统调用。我们的fopen,fwrite,fclose等c语言接口都是对系统调用的封装!

系统调用

初始open函数

在这里插入图片描述
如果创建失败返回-1

#include<sys/types.h>    
#include<sys/stat.h>    
#include<fcntl.h>    
#include<stdio.h>    
int main()    
{    
 int fd = open("log.txt",O_WRONLY|O_CREAT);    
  if(fd < 0)    
  {    
    perror("open");    
    return 1;                                                                                                                        
  }    
  return 0;    
} 

我们可以看到 创建的log文件权限很奇怪,这是因为我们没有设置第三个参数
在这里插入图片描述

#include<sys/types.h>    
#include<sys/stat.h>    
#include<fcntl.h>    
#include<stdio.h>    
int main()    
{    
 int fd = open("log.txt",O_WRONLY|O_CREAT,0666);                                                                                     
  if(fd < 0)    
  {    
    perror("open");    
    return 1;    
  }    
  return 0;    
}

这个设置的权限 0666 的意思是 所属组|拥有者|其他人 110 110 110 读权限 写权限 可执行权限 有 1代表 有该权限,110 110 110 翻译成10进制就是 0666 代表所属组|拥有者|其他人的权限都是可读可写但不能执行。

在这里插入图片描述
为什么 执行的结果是-rw-rw-r–呢?和我们预期的-rw-rw-rw不一样呢?因为我们设置权限还要和权限掩码的反码
按位与。
我们在命令行中输入umask 可以看到权限掩码 0002
这意味着 其他人的权限 要特别按位101,一定没有写权限。
在这里插入图片描述
当我们把默认权限设置为0000的时候
在这里插入图片描述
0666 就符合我们的预期了

在这里插入图片描述
第二个参数:falg
在这里插入图片描述
我们一般想到的实现,选择某个功能就是传多个参数,但是我们要在十个功能中选择一个呢,就要写10个falg 这个方法就不是很好
在这里插入图片描述
open函数 第二个参数 就是利用位图的思想,把一个整数32位的每一位01都看成一个标记位。
在这里插入图片描述
在这里插入图片描述
同理我们知道 O_WRONLY 等也是 数字定义的宏

O_TRUNC 这个选项的作用,写方式打开不存在就创建,存在就先清空。
O_APPEND 追加写

返回值fd

对应fd的0,1,2 被标准输入(键盘) 标准输出(显示器) 标准(显示器)错误占用了
在这里插入图片描述
在这里插入图片描述
证明:我们往1里写数据就是直接写在显示器上了
在这里插入图片描述
在这里插入图片描述

为什么我们向fd一个整数写就写入文件了呢?

在这里插入图片描述
因为在中我们有很多文件被打开,所以操作系统就先描述(stuct file)包括权限,所属进程等。后把这些文件以双向链表的形式组织起来。因为进程和文件的关系是1:n 所以每个进程都有一个struct files的file*数组,通过strcut files 数组的下标 找到struct file fd本质就是 struct files 的下标!

怎么理解读写操作

每个struct file 都有一个文件缓冲区,我们写文件,如果是新的文件,就是先写入到文件缓冲区,然后再拷贝到磁盘,如果是修改,磁盘里的数据先完全拷贝到文件缓冲区,然后再文件缓冲区中修改,然后再拷贝回磁盘。
读文件先在文件缓冲区找,没找到,就把进程挂起或者阻塞,把磁盘里的数据拷贝到文件缓冲区来。
读写本质是拷贝函数

总结open函数有哪些功能

  • 创建file
  • 开辟文件缓冲区的空间,加载数据
  • 查进程的文件描述符表
  • file地址,填入对应的下标中
  • 返回下标

怎么理解往硬件(显示器,键盘)中读写数据

在这里插入图片描述
硬件厂商都提供了每个硬件的读写方法,特别的如键盘的的方法设置为空,显示器写方法设置为空。然后把这些读写方法封装成一层驱动层。 在file结构体中 通过函数指针调用这些方法。虽然这个函数指针都叫read 但是每个类型不同结构体的read指向的是不同的方法。上层调用read/write方法自动完成了读写操作

如何理解FILE*访问文件

FILE 是一个结构体类型
封装了fd

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-15 15:30:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-15 15:30:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-15 15:30:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-15 15:30:07       20 阅读

热门阅读

  1. Qt中的TCP通信:一个详细指南

    2024-05-15 15:30:07       11 阅读
  2. LeetCode1523.在区间范围内统计奇数数目

    2024-05-15 15:30:07       13 阅读
  3. 桥接模式

    2024-05-15 15:30:07       10 阅读
  4. 5.14号模拟前端面试10问

    2024-05-15 15:30:07       13 阅读
  5. Python实战

    2024-05-15 15:30:07       16 阅读
  6. Hive内部表(管理表)和外部表的区别

    2024-05-15 15:30:07       9 阅读
  7. Intel RealSense D455深度相机驱动安装与运行

    2024-05-15 15:30:07       13 阅读
  8. 配置多个SSH密钥以访问不同平台(GitHub、Gitee)

    2024-05-15 15:30:07       14 阅读
  9. 用wordpress建外贸独立站的是主流的外贸建站方式

    2024-05-15 15:30:07       14 阅读
  10. HIVE调优

    2024-05-15 15:30:07       11 阅读
  11. AFM 433

    2024-05-15 15:30:07       14 阅读
  12. C语言-STM32:介绍PWM,并使用PWM实现呼吸灯

    2024-05-15 15:30:07       11 阅读
  13. 你眼中的IT行业现状与未来趋势

    2024-05-15 15:30:07       11 阅读