妇女儿童心理咨询网站建设/国内永久免费域名注册

妇女儿童心理咨询网站建设,国内永久免费域名注册,惠州个人做网站联系人,软件编程入门先学什么文章目录 1. 前言1.1 C语言文件知识回顾 2. 文件2.1 文件基础知识 3. 被打开的文件3.1 以C语言为主,先回忆一下C文件接口3.2 过渡到系统,认识文件系统调用3.3 访问文件的本质3.4 重定向&&缓冲区 序:在深入了解了进程的内容后&#xf…

文章目录

      • 1. 前言
        • 1.1 C语言文件知识回顾
      • 2. 文件
        • 2.1 文件基础知识
      • 3. 被打开的文件
        • 3.1 以C语言为主,先回忆一下C文件接口
        • 3.2 过渡到系统,认识文件系统调用
        • 3.3 访问文件的本质
        • 3.4 重定向&&缓冲区

  • 序:在深入了解了进程的内容后,我们对于进程的学习将会告一个段落,现在我将对Linux中的基础IO部分的内容进行一个梳理,本章节将围绕文件描述符来走进文件的部分,进而了解对于基础IO这个宏观的理解。

1. 前言

1.1 C语言文件知识回顾

文件分为程序文件和数据文件
文件名 == 文件路径+文件名主干+文件后缀

数据文件:

  • 文本文件
  • 二进制文件

流:

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

C程序针对文件、画面、键盘等的数据输⼊输出操作都是通过流操作的。

⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

标准流:

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动的时候,默认打开了3个流:

stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。
stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出
流中。

stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。

stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针。

C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

C语言提供的一些有关文件操作的接口函数:

在这里插入图片描述

scanf:从标准输入流上读取格式化的数据
fscanf:从指定的输入流上读取格式化的数据
sscanf:在字符串中读取格式化的数据

printf:把数据以格式化的形式打印在标准输出流上
fprintf:把数据以格式化的形式打印在指定的输出流上
sprintf:把格式化的数据转化成字符串

2. 文件

2.1 文件基础知识

共识原理:

1. 文件 == 内容+属性

2. 文件分为打开的文件和没打开的文件

3. 打开的文件----->谁打开的?自然是进程。(本质是研究进程和文件的关系)

4. 没打开的文件----->在哪里放着呢?在磁盘上放着。我们最关心什么问题呢?没有被打开的文件非常多。文件如何被分门别类的放置好----->我们要快速的进行增删查改(快速找到文件)

问题一:文件是如何存储的呢?

1. 文件被打开必须先被加载到内存里
2. 进程:打开的文件=1:n
基于上面两点,操作系统内部一定存在大量的被打开的文件!

问题二:那么OS要不要管理这些被打开的文件呢?怎么管理呢???

一定是先描述,再组织!!!-----在内核中,一个被打开的文件都必须有自己的文件打开对象,该对象包含了文件的很多属性struct XXX(文件属性)

3. 被打开的文件

首先,确认我们的研究对象是被打开的文件

3.1 以C语言为主,先回忆一下C文件接口

问题一:当前路径是什么?

当前路径,就是当前进程的当前路径cwd(current work direction)

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>int main(){printf("pid:%d\n",getpid());int fd=open("loggggg.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd<0){perror("open");return -1;}close(fd);sleep(1000);return 0;
}

当我们执行完后,发现我们在当前路径下,创建了loggggg.txt文件。
在这里插入图片描述
在这里插入图片描述

int main()
{printf("pid:%d\n",getpid());chdir("/home/zby/");int fd=open("loggggg.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);if(fd<0){perror("open");return -1;}close(fd);sleep(1000);return 0;
}

问题二:如果我更改了当前进程的cwd,是不是就可以把文件新建到其他目录?

事实确实是如此的!!!

当我调用系统接口,改变当前进程的路径的时候,再去创建文件,发现创建文件的路径也随之改变
在这里插入图片描述
在这里插入图片描述

C程序启动的时候会默认打开三个标准输入输出文件
实际上,默认打开这三个标准输入输出流不是c语言的特性,是操作系统的特性,进程会默认打开键盘,显示器,显示器!!!

在这里插入图片描述

3.2 过渡到系统,认识文件系统调用

文件其实是在磁盘上,磁盘是外部设备,访问磁盘文件其实就是在访问硬件!

几乎所有的库,只要是访问硬件设备,必定要封装系统调用!(printf/fprintf/fscanf/fwrite/fread/fgets/gets/…----库函数系统调用接口)

open( )函数

在这里插入图片描述

#define ONE_FLAG 000000001<<0
#define TWO_FLAG 000000001<<1
#define THREE_FLAG 000000001<<2
#define FOUR_FLAG 000000001<<3void flag(int flag)
{if(flag&ONE_FLAG){printf("ONE_FLAG ");}if(flag&TWO_FLAG){printf("TWO_FLAG ");}if(flag&THREE_FLAG){printf("THREE_FLAG ");}if(flag&FOUR_FLAG){printf("FOUR_FLAG ");}printf("\n");
}int main()
{flag(ONE_FLAG);flag(ONE_FLAG|TWO_FLAG);flag(ONE_FLAG|TWO_FLAG|THREE_FLAG);flag(ONE_FLAG|TWO_FLAG|THREE_FLAG|FOUR_FLAG);return 0;
}

上面的代码演示结果如下:

在这里插入图片描述

这里强调一下位图的使用,open的第二个参数也是如此。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里只展示了常用的几个宏。

3.3 访问文件的本质

文件描述符:

文件描述符0 1 2分别表述标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。
在OS接口层面,只认fd ,即文件描述符。

FILE * fopen( )中的FILE是C语言提供的一个结构体,既然操作系统只认文件描述符,那么该结构体中一定封装了文件描述符fd。
例如: stdin -> _ fileno(stdin的fd)

close:将该文件描述符所对应的数组下标所指向的对象置空,并且引用计数减一。(一个文件是可以被多个用户使用的,如:stdout和stderr都是指向显示器文件。)

在这里插入图片描述

上面的代码是用户层,下面的组织形式是OS层。

当我们访问一个文件时,系统是通过该进程的task_struct结构体内的file_struct * file的结构体指针指向的文件描述符表,用该下标fd访问对应文件的PCB结构体,然后对磁盘将内容存放到文件缓冲区内,当我们要访问时,就将文件缓存区的文件内容拿出来用!!!

其中,read的本质是拷贝文件缓冲区的内容。

fd文件描述符的本质也是文件指针数组的下标

对文件内容,做任何操作,都必须把文件先加载(磁盘------>内存的拷贝)到内核对应的文件缓冲区内!!!

3.4 重定向&&缓冲区

文件描述符的的分配原则:从下标0开始,最小的,没有被使用的数组位置作为最新的fd文件描述符给用户

重定向:更改文件描述符的指针指向----->(数组下标不变)
dup2:进行重定向的系统调用
重定向:打开文件的方式+dup2

进程历史打开的文件与进行各种重定向关系都和未来进行程序替换无关!!!
程序替换不影响文件访问

问题一:问题一:stdout和stderr都是指向显示屏,有什么区别,为什么有了“1”,还要有“2”???

让我们看下面一段代码:

#include<stdio.h>
int main(){fprintf(stdout,"i am normal\n");fprintf(stdout,"i am normal\n");fprintf(stdout,"i am normal\n");fprintf(stdout,"i am normal\n");fprintf(stdout,"i am normal\n");fprintf(stderr,"i am error\n");fprintf(stderr,"i am error\n");fprintf(stderr,"i am error\n");fprintf(stderr,"i am error\n");fprintf(stderr,"i am error\n");return 0;
}

演示结果如下:
在这里插入图片描述

此时我们没看出什么,但当我们将这些内容都输入到一个文件中就会发生变化
在这里插入图片描述

这是为什么呢?让我们接着看!!!
当运行该段代码的时候在这里插入图片描述

发现两个分离了在这里插入图片描述

当我们直接将结果输入到log.txt文件当中时,默认是将文件描述符1所指向的文件内容传到log.txt中,所以打印到stderr文件中的内容不会打印到log.txt中去,而为什么stderr和stdout都指向显示器,是因为,当程序运行后的显示中可能会有错误信息,而当打印的信息很繁杂的时候,就需要将这些错误信息统一起来!!!所以,结论:是为了将错误信息单独拉出来。

问题二:如何理解“一切皆文件”?

在这里插入图片描述

当我们的使用系统调用接口read时,传一个文件描述符fd,操作系统就会通过该进程teak_struct内的files指针找到一个文件描述符表,找到对应的文件的PCB结构,调用里面的f_ops指针,指向operationfunc的结果体,然后调用里面的函数指针int(&readp)(),该函数指针指向对应的硬件设备,不同的硬件设备提供不同的read和write接口,但在operationfunc里面都是统一的接口,从而调用对应的read接口!!!
(用统一的文件接口来访问不同的硬件设备 == 一切皆文件)

其中的各种struct file就是虚拟文件系统(VFS),所以不同的硬件对应的读写方式肯定是不一样的,但是它们都有自己的 read 和 write 方法。也就是说,这里的硬件可以统一看作成一种特殊的文件。比如这里设计一种结构:struct file,它包括文件的属性、文件的操作或方法等,Linux 说一切皆文件,Linux 操作系统就必须要能够保证这点。在 C 语言中,怎么让一个结构体既有属性又有方法呢?函数指针。此时每一个硬件都对应这样一个结构,硬件一旦数量很多,操作系统就需要对它们进行管理 —— 先描述,再组织。所谓的描述就是 struct file;而组织就是要把每一个硬件对应的结构体关联起来,并用 file header 指向。所以在操作系统的角度,它所看到的就是一切皆文件,也就是说所有硬件的差异经过描述就变成了同一种东西,只不过当具体访问某种设备时,使用函数指针执行不同的方法达到了不同的行为。现在就能理解为什么可以把键盘、显示器这些设备当作文件,因为本质不同,设备的读写方法是有差异的,但我们可以通过函数指针让不同的硬件包括普通文件在操作系统看来是同样的方法、同样的文件。所以,一切皆文件。

总结:

本篇文章从C语言入手,从C语言的文件接口出发,逐渐过渡到系统对于文件的调用,本文的研究对象是已经被打开的文件,我们用先描述,再组织6个字,创建文件结构体对文件进行管理,然后通过几个细致的例子和对问题的讲解,说出我对重定向和缓冲区的理解!!!

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

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

相关文章

JDK 24 发布,新特性解读!

一、版本演进与技术格局新动向 北京时间3月20日&#xff0c;Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本&#xff0c;其技术革新力度远超预期——共集成24项JEP提案&#xff0c;相当于Java 22&#xff08;12项&#xff09;与Java 23&#xff08;12项&#…

批量图片压缩工具,高效减小文件大小并保持质量

在处理大量图片时&#xff0c;如何高效压缩文件大小并保持画质是个常见难题。今天为大家推荐一款专业工具——JPGC&#xff0c;它专为图片批量处理设计&#xff0c;能快速压缩JPG/JPEG格式图片&#xff0c;在减小文件体积的同时尽可能保留画质&#xff0c;尤其适合处理数码相机…

软考中级-软件设计师 准备

软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值&#xff1a; 二、软考备考2.1、相关书籍2.2、推荐课程&#xff1a;B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考&#xff0c;一般是五月末和十一月的中旬 以下…

【数据挖掘】Python基础环境安装配置

【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2&#xff0c;然后基于该Python版本安装Jupyter not…

OpenLayers集成天地图服务开发指南

以下是一份面向GIS初学者的OpenLayers开发详细教程&#xff0c;深度解析代码&#xff1a; 一、开发环境搭建 1.1 OpenLayers库引入 <!-- 使用CDN引入最新版OpenLayers --> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/ollatest/ol.c…

【免费】2000-2019年各省地方财政房产税数据

2000-2019年各省地方财政房产税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政房产税 4、范围&#xff1a;31省 5、指标说明&#xff1a;房产税是对个人和单位拥有的房产征收的一种…

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif&#xff0c;就试着用Python做了下&#xff0c;感觉效果还行&#xff0c;这里做个记录。 二、准备 先下载安装对应的库&#xff0c;命令如下&#xff1a; pip install moviepy …

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载&#xff0c;对比传统SPI机制&#xff1a; 传统SPI扫描路径&#xff1a;META-INF/services/** Spring Boot新方案&#xff1a;META-INF/spring/org.springfram…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的异常处理:全局异常与自定义异常

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

moveit2基础教程上手-使用xarm6演示

0、前置信息 开发环境&#xff1a;wsl。 ros版本&#xff1a;jazzy&#xff0c;ubuntu版本&#xff1a;24.04 xarm-ros2地址 1、启动Rviz&#xff0c;加载 Motion Planning Plugin&#xff0c;实现演示功能 Getting Started — MoveIt Documentation: Rolling documentation…

第十六届蓝桥杯模拟二

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以实现将多个元素进行合成&#xff0c;实现特殊效果。AE的项目文件是aep&#xff0c;可以将素材、层、效果等一切信息&#xff0c;保存在这个项目文件中。 AE的原理&#xff0c;和PS的原理非常类似。 操作界面 操作界面如…

【React】基于自定义Hook提取公共逻辑

目录 自定义Hook自定义Hook 1自定义Hook 2使用 注意事项 自定义Hook 作用&#xff1a;提取封装一些公共的处理逻辑 玩法&#xff1a;创建一个函数&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在组件中调用这个方法&#xff01; 自定义Hook 1 页面加载的时候修改浏…

AUTOSAR与arxml的文档解析

如下是文档脑图 一、文档概述 该文档是 AUTOSAR 经典平台的应用接口用户指南&#xff0c;主要解释 **Al Table&#xff08;应用接口表&#xff09;** 的结构、方法论及相关技术细节&#xff0c;帮助开发者理解如何通过标准化接口实现软件组件的互操作性。 关键内容 目的&#…

油候插件、idea、VsCode插件推荐(自用)

开发软件&#xff1a; 之前的文章&#xff1a; 开发必装最实用工具软件与网站 推荐一下我使用的开发工具 目前在用的 油候插件 AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 让查询变成多列&#xff0c;而且可以流式翻页 Github 增强 - 高速下载 github下载 TimerHo…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…

区块链开发技术公司:引领数字经济的创新力量

在数字化浪潮席卷全球的今天&#xff0c;区块链技术作为新兴技术的代表&#xff0c;正以其独特的去中心化、不可篡改和透明性等特点&#xff0c;深刻改变着各行各业的发展格局。区块链开发技术公司&#xff0c;作为这一领域的先锋和推动者&#xff0c;正不断研发创新&#xff0…