基础IO[一]

news2024/11/24 3:59:06

文件=文件内容+属性

文件在硬盘上放着,我们的流程->写代码->编译->运行->访问文件。那么本质上是谁在访问?

是进程在访问。进程访问文件是需要通过接口来访问。

文件在磁盘上放着,要向硬件写入文件,谁有权限呢?必须让操作系统提供接口,用户和操作之间提供一个软件层,来帮助用户访问文件。操作系统提供文件类的系统调用接口,语言上,对接口进行了封装,让接口进行更好的使用。而且系统级别的封装不具有跨平台的条件。

一切皆文件

对于文件

一般的普通文件:read,write

显示器:printf ,cout -一种输出

键盘:cin,scanf——一种输入

文件所具有的属性输入和输出,对于一般文件而言自不必说,但是对于硬件呢?系统方面提供了接口使得可以输入和输出,而对于Linux系统而言一切皆文件,是只要有接口提供了可以输入的输出,那么这个文件无论是常规意义上的一般文件还是硬件设备,只要它可以输入和输出,他就是文件按,文件最重要的特征就是输入和输出,而只要提供输入和输出的接口的,我们都可以称呼他为文件。这里的一切皆文件也是软件层的概念。

当一个进程运行起来的时候,每个进程都会记录自己当前所处的工作路径 /proc cwd就是当前工作路径,这个路径就是当前路径。

文件写入的时候只需要保存有效数字,不需要\0作为结尾

如何使用一个值代表多种状态呢?可以通过位运算,一个字节8个比特位,每一个比特位都可以代表不同的状态。


  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<unistd.h>
  4 
  5 #define ONE 0x1
  6 #define TWO 0x2
  7 #define THREE 0x4 
  8 void show (int flag)
  9 {
 10   if(ONE&flag)
 11   printf("hello one\n");
 12   if(TWO&flag)
 13   printf("hello two\n");
 14   if(THREE&flag)
 15   printf("hello three\n");
 16 //  printf("hello four\n");                                                                                                                                     
 17 }
 18 
 19 int main()
 20 {
 21   show(ONE);
 22   printf("-------------------------------------\n");
 23   show(TWO);//设置一个标志位哦
 24   printf("-------------------------------------\n");
 25   show(ONE|TWO);//设置1和2两个标志位,位运算或之后的值代表着这个值无论是ONE还是TWO与运算都能得到原来的值
 26   printf("-------------------------------------\n");
 27   show(ONE | TWO | THREE);
 28   return 0;
 29 }
~

运行结果

这是操作系统传递标志位的一种方式。 

简单的系统调用

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 #include<string.h>
  5 #include<fcntl.h>
  6 #include<stdlib.h>
  7 
  8 int main()
  9 {
 10   int fd =open("log.txt",O_WRONLY); //第一个代表路径,第二个代表标志位,只读或者只写
 11   if(fd<0)
 12   {
 13     perror("open fail\n");
 14     exit(1);
 15 
 16   }
 17   else{
 18     printf("success 退出码:%d\n",fd);                                                                                                                          
 19   }
 20 
 21   return 0;
 22 }

这是没有log.txt没有这个文件那么我们的运行结果是什么?

这和C语言的不一样啊,怎么回事呢?这是因为C语言在语言层帮我们封装了,导致我们使用起来很方便,但是系统原生的很简洁。我们需要加其他的选项才可以实现。

我们需要使用之前的位运算来加上其他的选项达成,没有文件就创建的效果

int fd =open("log.txt",O_WRONLY | O_CREAT); //第一个代表路径,第二个代表标志位,只读或者只写

但是这样的我们会发现创建的文件权限好像不太对啊

那是因为我们在创建文件的时候需要加入,权限的选项。

 int fd =open("log.txt",O_WRONLY | O_CREAT,0666); //第一个代表路径,第二个代表标志位,只读或者只写                  

但是这个时候权限好像少了点什么

这是因为在创建的时候umask会进行过滤,但是我们不想让umask过滤怎么办呢?

系统中有一个接口可以设置umask

对umask进行设置之后就正常了

 

打开之后write和read都同理

而且为什么退出码是3? 0 1 2都去哪里了? 

分析接口细节

我们在打开文件时有一个FILE* 那么 FILE是什么呢?答案是结构体,由C标准库提供的结构体,内部有多个成员。那么站在系统层,系统认fd还是FILE,那么可以得出结论,FILE结构体里面绝对封装了fd。那么怎么证明。

printf("stdin:%d\n",stdin->_fileno);       

使用这句代码我们可以查看他的打印结果,可以查看到内部的fd

 

这里我们可以看出内部的fd为1。其他的结果以此类推。

那么什么是fd呢?进程要访问文件,必须先打开文件,文件要被访问,必须先加载到内存之中才能之间被访问,那么如果打开大量的文件,也需要管理起来,先描述再组织。就需要为每一个打开的文件创建struct_file对象。充当一个被打开的对象,包含一个被打开文件的几乎所有内容,权限属性缓冲区等。如果有很多再用双链表链接起来。

fd就代表当前进程的struct数组下标对应的文件。fd再内核中本质上是一个下标。

文件描述符是有上限的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云4核8G服务器多少钱?2024精准报价

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;轻量应用服务器4核8G12M带宽一…

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…

在虚拟机上完成Centos安装

Linux学习和使用 前言如何安装Centos初始化操作 使用VMware备份操作系统快照克隆 内容总结参考链接 本人介绍:2023年全国大学生数学建模竞赛国家二等奖,2022年蓝桥杯省二等奖,这里是一个和你一起不断努力,不断前进的程序猿一枚 前言 简单介绍一下本片文章将会讲到的内容:本章节…

通过容器化释放云的力量

NCSC (英国国家网络安全中心) 经常被问到的一个问题是是否在云中使用容器。这是一个简单的问题&#xff0c;但答案非常微妙&#xff0c;因为容器化的使用方式有很多种&#xff0c;其中一些方法比其他方法效果更好。 今天&#xff0c;我们发布了有关使用容器化的安全指南&#…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…

线性表的链式存储结构

顺序存储结构不足的解决方法 顺序存储结构有缺点&#xff0c;最大的缺点是插入删除时需要移动大量元素&#xff0c;会导致时间效率下降。 线性表链式存储结构的定义 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素&#xff0c;这些存储单元可以是连…

Impala-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点2.框架优点3.框架限制 三、架构图1.Impala Daemon2.Statestore3.Catalog 四、Impala查询流程1.发起查询2.生成执行计划3.分配任务4.交换中间数据5.汇集结果6.返回结果 总结参考链接 一、背景和起源 现有的大数据查询分析工具H…

volatile的实现

字节码层面 ACC_VOLATILE JVM volatile内存区的读写都加了内存屏障 OS和硬件层面 windows lock 指令实现

文献阅读:Mamba: Linear-Time Sequence Modeling with Selective State Spaces

文献阅读&#xff1a;Mamba: Linear-Time Sequence Modeling with Selective State Spaces 1. 文章简介2. 方法介绍 1. State Space Models2. Selective State Space Models 3. 实验考察 & 结论 1. 简单问题上的验证2. 实际场景效果 1. 语言模型2. DNA模型3. 语音模型 3. 细…

深入学习Pandas:数据连接、合并、加入、添加、重构函数的全面指南【第72篇—python:数据连接】

深入学习Pandas&#xff1a;数据连接、合并、加入、添加、重构函数的全面指南 Pandas是Python中最强大且广泛使用的数据处理库之一&#xff0c;提供了丰富的函数和工具&#xff0c;以便更轻松地处理和分析数据。在本文中&#xff0c;我们将深入探讨Pandas中一系列数据连接、合…

pycharm控制STM32F103ZET6拍照并上位机接收显示(OV7670、照相机、STM32、TFTLCD)

基于STM32的照相机 准备工作最终效果一、下位机1、主函数2、OV7670初始化 二、上位机1、控制拍照2、接收图片数据 三、资源获取 准备工作 一、硬件及片上资源: 1,串口1(波特率:921600,PA9/PA10通过usb转ttl连接电脑&#xff0c;或者其他方法)上传图片数据至上位机 2,串口2(波特…

Unity性能优化

非原创 &#xff0c;参考文章&#xff1a; 2024 腾讯游戏客户端面经 - 知乎 (zhihu.com) C#篇 1.Unity API GameObject.GetComponent Unity是基于组件的开发方式,所以GetComponent是一个高频使用的函数 每次调用GetComponent 时,Unity都要去遍历所有的组件来找到目标组件…

首次安装Mysql数据库

1、在mysql官网下载自己需要的版本 2、选择安装类型 3、 检查一下需求版本 4、 这里可能会弹出如下信息,先不用管这一步,点击Yes继续即可 5、 安装需要的环境,点击执行就可以,此过程会比较慢 如下就是全面安装完成了,点击next即可

寒假9-蓝桥杯训练

//轨道炮 #include<iostream> using namespace std; #include<algorithm> int logs[100010]; int main() {int n;cin >> n;for (int i 1;i < n;i){cin >> logs[i];}sort(logs 1, logs n 1);int ans 1000000000;for (int i 2;i < n;i){if (…

Java外卖小程序管理系统

技术架构&#xff1a; springboot ssm mysql redis 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 商品管理&#xff1a;新增商品、所有商品 菜单管理&#xff1a;菜单管理、菜单分类 订单管理&#xff1a;订单总览&#xff08;包括未付款、已付款、已…

Python中的正则表达式(一)

在Python中&#xff0c;正则表达式是一种用于匹配和操作字符串的强大工具。正则表达式由一系列字符和特殊字符组成&#xff0c;用于定义搜索模式。 在Python中&#xff0c;我们使用内置的 re 模块来操作正则表达式。要使用正则表达式&#xff0c;我们首先需要导入 re 模块。 下…

没更新的日子也在努力呀,布局2024!

文章目录 ⭐ 没更新的日子也在努力呀⭐ 近期的一个状态 - 已圆满⭐ 又到了2024的许愿时间了⭐ 开发者要如何去 "创富" ⭐ 没更新的日子也在努力呀 感觉很久没有更新视频了&#xff0c;好吧&#xff0c;其实真的很久没有更新短视频了。最近的一两个月真的太忙了&#…

mysql经典4张表问题

1.数据库表结构关联图 2.问题&#xff1a; 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询名字中含有"风"字的学生信息5、查询课程名称为"数学"&…

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …

【网站项目】027学校运动会信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…