Linux|基础IO

Linux|基础IO

  • 回顾c语言的文件操作
  • 提炼对文件的理解
  • 系统调用
    • 初始open函数
    • 返回值fd
    • 为什么我们向fd一个整数写就写入文件了呢?
    • 怎么理解读写操作
    • 总结open函数有哪些功能
    • 怎么理解往硬件(显示器,键盘)中读写数据
    • 如何理解FILE*访问文件

回顾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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/703166.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NXP RT1176(一)——二级BootLoader开发(安全引导加载程序SBL)

目录 1. 开发环境 2. 二级BOOT的功能 3. 步骤 3.1 配置源码 3.2 构建项目 3.2.1 MDK 3.2.2 IAR&#xff08;IAR也编译一下工程看看&#xff0c;这样两个平台都可以支持了&#xff09; 单核M7的开发&#xff01;&#xff01; 1. 开发环境 本文Windows下开发&#xff1a;…

ALV 红绿灯

前言 在ABAP ALV中&#xff0c;LIGHTS_FIELDNAME参数是用于实现行级视觉指示或“灯光效果”的一个重要设置项&#xff0c;尤其适用于标记或突出显示列表中符合特定条件的行。这个参数通常是在定义ALV布局&#xff08;使用结构如LVC_S_LAYOUT或通过SALV类的相应方法&#xff09;…

每日学习 - APK解包

文章目录 APK的定义解析APKAPK 是什么每个文件的意义classes.dexAndroidManifest.xmlassetslibres & resources.arsc 反编译工具apktool apk解包 秒了~ APK的定义 APK&#xff08;Android Package Kit&#xff09;是用于部署和分发Android操作系统上应用程序的软件包格式。…

使用KNN预测一个新的点,以及将这个点用五角星进行matplotlib可视化展示

概述 基于之前的KNN案例继续做一些操作。 之前的完整代码如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn.model_…

写后端项目时上传文件接口使用阿里云oss-规范写法

文章目录 开通对象存储服务密钥管理点击头像点击密钥管理创建新密钥AccessKey 写在yml配置文件中相关配置1.pom依赖2.全局配置类3.AliOssUtil 工具类3.AliOssProperties类&#xff0c;用于读取yml文件中写入的密钥4.controller层&#xff0c;用于写传输文件的接口 开通对象存储…

机器人工具箱学习(三)

一、动力学方程 机器人的动力学公式描述如下&#xff1a; 式中&#xff0c; τ \boldsymbol{\tau} τ表示关节驱动力矩矢量&#xff1b; q , q ˙ , q \boldsymbol{q} ,\; \dot{\boldsymbol { q }} ,\; \ddot{\boldsymbol { q }} q,q˙​,q​分别为广义的关节位置、速度和加速…

【019】基于SSM+JSP实现的进销存管理系统

项目介绍 进销存管理系统是对企业生产经营中物料流、资金流进行条码全程跟踪管理&#xff0c;从接获订单合同开始&#xff0c;进入物料采购、入库、领用到产品完工入库、交货、回收货款、支付原材料款等&#xff0c;每一步都为您提供详尽准确的数据。有效辅助企业解决业务管理…

前端通知组件封装

背景 实现如上图效果&#xff1a;点击小铃铛&#xff0c;从右侧展示通知&#xff0c;点击其中一条跳&#xff0c;转到一个新页面&#xff1b;小铃铛数目减少&#xff1b; 实现 index.vue <template><el-drawerv-if"visible":visible.sync"visible&…

国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟

原文链接&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取&#xff0c;使用命令行操作Google Chrome都能…

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…

【PDF技巧】PDF如何解密?

PDF文件设置了加密&#xff0c;需要密码才能够打开文件或者编辑文件&#xff0c;那么如何解密PDF密码&#xff1f;今天我们来一起学习一下。 首先是在已知密码的情况下&#xff0c;PDF文件中的打开密码或者是限制编辑&#xff0c;想要解密PDF密码&#xff0c;我们只需要在PDF编…

(Java面试题——基础版)JVM、JRE和JDK的关系

JVM Java Virtual Machine是Java虚拟机 &#xff0c;Java程序需要运行在虚拟机上 &#xff0c;不同的平台有自己的虚拟机 &#xff0c;因此Java语言可以 实现跨平台。JVM 负责将 Java 字节码&#xff08;即编译后的 .class 文件&#xff09;翻译成特定平台上的机器码&#xff0…