基础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 基金会旨在通过支持专注于隐私、…

代码随想录刷题笔记 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…

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

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

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…

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…

AES加密后的密码可以破解吗

AES&#xff08;高级加密标准&#xff09;是一种广泛使用的对称加密算法&#xff0c;设计用来抵御各种已知的攻击方法。AES使用固定块大小的加密块和密钥长度&#xff0c;通常是128、192或256位。它被认为是非常安全的&#xff0c;到目前为止&#xff0c;没有已知的可行方法能够…

【详解】斗地主随机发牌项目

目录 前言&#xff1a; 1.初始化牌 2.洗牌 3.揭牌 总代码&#xff1a; Card类&#xff1a; CardGame类&#xff1a; Main类&#xff1a; 结语&#xff1a; 前言&#xff1a; 斗地主是全国范围内的一种桌面游戏&#xff0c;本节我们来实现一下斗地主中的简单初始化牌、…

Spring Boot 笔记 006 创建接口_注册

1.1 由于返回数据都是以下这种格式&#xff0c;那么久再编写一个result实体类 报错了&#xff0c;原因是没有构造方法 可以使用lombok的注解自动生成&#xff0c;添加无参的构造器和全参的构造器 package com.geji.pojo;import lombok.AllArgsConstructor; import lombok.NoArg…

【MySQL】操作库 —— 库的操作 -- 详解

一、增删数据库 1、创建数据库 create database db_name; 本质就是在 /var/lib/mysql 创建一个目录。 说明&#xff1a; 大写的表示关键字。[ ] 是可选项。CHARACTER SET&#xff1a;指定数据库采用的字符集。COLLATE&#xff1a;指定数据库字符集的校验规则。 2、数据库删除…

Linux第51步_移植ST公司的linux内核第3步_添加修改设备树

1、设备树文件的路径 1)、创建linux中的设备树头文件 在“my_linux/linux-5.4.31/arch/arm/boot/dts/”目录中&#xff0c;以“stm32mp15xx-edx.dtsi”为蓝本&#xff0c;复制一份&#xff0c;并命名为 “stm32mp157d-atk.dtsi”&#xff0c;这就是我们开发板的设备树头文件。…

【stomp实战】Springboot+Stomp协议实现聊天功能

本示例实现一个功能&#xff0c;前端通过websocket发送消息给后端服务&#xff0c;后端服务接收到该消息时&#xff0c;原样将消息返回给前端。前端技术栈htmlstomp.js&#xff0c;后端SpringBoot 前端代码 关于stomp客户端的开发&#xff0c;如果不清楚的&#xff0c;可以看…

机器学习10-特征缩放

特征缩放的目的是确保不同特征的数值范围相近&#xff0c;使得模型在训练过程中更加稳定&#xff0c;加速模型收敛&#xff0c;提高模型性能。具体而言&#xff0c;零均值和单位方差的目标有以下几点好处&#xff1a; 1. 均值为零&#xff08;Zero Mean&#xff09;&#xff1a…

15 ABC基于状态机的按键消抖原理与状态转移图

1. 基于状态机的按键消抖 1.1 什么是按键&#xff1f; 从按键结构图10-1可知&#xff0c;按键按下时&#xff0c;接点&#xff08;端子&#xff09;与导线接通&#xff0c;松开时&#xff0c;由于弹簧的反作用力&#xff0c;接点&#xff08;端子&#xff09;与导线断开。 从…

【开源】SpringBoot框架开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

java 执行方式和类加载过程

java默认属于混合执行&#xff1a; 编译和解释并存 java先进行解释执行&#xff0c;遇到多次重复的代码会把它编程成可执行文件&#xff0c;方便下次直接执行。 可以通过VM参数来修改执行方式。 类加载过程