基础IO[一]

文件=文件内容+属性

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

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

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

一切皆文件

对于文件

一般的普通文件: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 0x16 #define TWO 0x27 #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.mzph.cn/news/680150.shtml

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

相关文章

java之Maven

1. maven Maven是管理和构建java项目的工具 项目依赖资源(jar包)的管理,避免版本冲突统一项目结构项目构建&#xff0c;标准跨平台(Linux,window,MacOS)的自动化项目管理 2.maven依赖仓库 2.maven安装 maven安装视频教程 3. IDEA集成Maven 4. maven的依赖范围 5. maven生命…

从基建发力,CESS 如何推动 RWA 发展?

2023 年 11 月 30 日&#xff0c;Web3 基金会&#xff08;Web3 Foundation&#xff09;宣布通过 Centrifuge 将部分资金投资于 RWA&#xff08;Real World Assets&#xff0c;真实世界资产&#xff09;&#xff0c;试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…

安装PostgreSQL和PostGIS

安装环境 Windows 2019 Standard Server 安装PostgreSQL 安装PostgreSQL 16 安装PostGIS 用PostgreSQL 16对应的PostGIS https://download.osgeo.org/postgis/windows/pg16/ https://download.osgeo.org/postgis/windows/pg16/postgis-bundle-pg16x64-setup-3.4.1-1.exe 创建…

LeetCode79. Word Search——回溯

文章目录 一、题目二、题解 一、题目 Given an m x n grid of characters board and a string word, return true if word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertic…

2301: 不定方程解的个数

题目描述 输出不定方程解的个数。在数学中&#xff0c;不定方程是数论中的一个重要课题&#xff0c;在各种比赛中也常常出现. 对于不定方程&#xff0c;有时我们往往只求非负整数解&#xff0c;现有方程axbyc0&#xff0c;其中x、y为未知量且不超过10000&#xff0c;当给定a、…

代码随想录刷题笔记 DAY 24 | 回溯算法理论基础 | 组合问题 No. 77

文章目录 Day 2401. 回溯算法理论基础1.1 什么是回溯法&#xff1f;1.2 为什么要使用回溯法&#xff1f;1.3 如何理解回溯法&#xff1f; 02. 组合问题&#xff08;No. 77&#xff09;2.1 题目2.2 笔记2.3 代码 Day 24 01. 回溯算法理论基础 1.1 什么是回溯法&#xff1f; &…

网络安全检查表

《网络攻击检查表》 1.应用安全漏洞 2.弱口令&#xff0c;默认口令 3.服务器互联网暴露 4.操作系统&#xff0c;中间件安全漏洞 5.研发服务器&#xff0c;邮件服务器等安全检查

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发&#xff0c;在数据库的选择上面&#xff0c;选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5…

c++ 一个头文件包含多个头文件预处理编译指令#ifndef cin

一个头文件包含多个头文件 #ifndef MERGED_HEADER_H #define MERGED_HEADER_H#ifndef MATH_UTILS_H #include "math_utils.h" #endif#ifndef STRING_UTILS_H #include "string_utils.h" #endif#endif在其他源文件中&#xff0c;只需包含 merged_header.h …

交叉熵损失函数(Cross-Entropy Loss)的基本概念与程序代码

交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;是机器学习和深度学习中常用的损失函数之一&#xff0c;用于分类问题。其基本概念如下&#xff1a; 1. 基本解释&#xff1a; 交叉熵损失函数衡量了模型预测的概率分布与真实概率分布之间的差异。在分类问题中&…

linux下ipconfig命令报:command not found 解决方法

参考博文&#xff1a; linux下ipconfig命令报:command not found 解决方法 CentOS7更新yum报Could not resolve host:mirrorlist.centos.org; Unknown error解决办法

re:从0开始的CSS学习之路 11. 盒子垂直布局

1. 盒子的垂直布局的注意 若两个“相邻”垂直摆放的盒子&#xff0c;上面盒子的下外边距与下面盒子的上外边距会发生重叠&#xff0c;称为外边距合并 若合并后&#xff0c;外边距会选择重叠外边距的较大值 若两个盒子具有父子关系&#xff0c;则两个盒子的上外边距会发生重叠&…

MySQL 聚合函数解析与示例

介绍: 在MySQL中,聚合函数是用于对多行数据执行计算并返回单个结果的函数。这些函数对于分析数据和提取摘要信息非常有用。本文将介绍MySQL中常用的聚合函数,包括它们的功能、语法和示例用法。 1. MAX: 作用:查询指定列的最大值。 示例用法: SELECT MAX(salary) FROM …

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵 题目链接&#xff1a;1277. 统计全为 1 的正方形子矩阵 代码如下&#xff1a; class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

Impala-架构与设计

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

Android录音功能的实现及踩坑记录

最近接到个需求&#xff0c;不使用第三方SDK的情况下实现IM通讯&#xff0c;文字聊天已经通过MQTT实现&#xff0c;而语音功能目前想到的较好解决方案就是进行录音文件的上传下载。可能还有更好解决方案&#xff0c;但我目前没想到&#xff0c;有建议的小伙伴劳烦指导下。 前提…

Microsoft Word 超链接

Microsoft Word 超链接 1. 取消超链接2. 自动超链接2.1. 选项2.2. 校对 -> 自动更正选项2.3. Internet 及网络路径替换为超链接 References 1. 取消超链接 Ctrl A -> Ctrl Shift F9 2. 自动超链接 2.1. 选项 2.2. 校对 -> 自动更正选项 ​​​ 2.3. Internet…

arduino ide esp32 网页按钮异步请求

前两天刚学&#xff0c;不咋懂&#xff0c;原理可以搜别的博主的文章&#xff0c;这是一个示例 #include<WiFi.h> #include<WebServer.h>#define ledpin 2const char* ssid"Your ssid"; //写你们家的WiFi名称 const char* password"Your password&…

[AIGC] 上传文件:后端处理还是直接阿里云OSS?

在构建Web应用时&#xff0c;我们经常需要处理用户上传的文件。这可能是图片、视频、文档等各种各样的文件。但是&#xff0c;上传文件的方式有很多种&#xff0c;最常见的两种方式是&#xff1a;通过后端处理&#xff0c;或者直接上传至云存储服务&#xff0c;如阿里云OSS。那…