【Linux系统】文件描述符fd

1.回顾一下文件

我们之前对文件的理解是在语言层上,而语言层去理解文件是不可能的!!!

下面是一份c语言文件操作代码!!!

#include<stdio.h>      
                                                                                                                                                                      
int main()
{
    FILE* fd = fopen("log.txt", "w");
    if(fd == NULL)
    {
        perror("fopen");
        return 1;
    }

    
    fclose(fd);                 
    return 0;                 
}     

 我们要进行文件操作,前提是我们的程序跑起来了。

文件打开和关闭是,是CPU在执行我们的代码。

 w含义:

1.如果不存在,就在当前路径下,新建指定的文件。

2.默认打开文件的时候。就先把目标文件清空!--》所以可以用来新建文件,清空文件!

50aeeb0185fd4927aa77acac32da1fa9.png

 我们又使用输出重定向符号操作文件,我们发现文件被清空了,输出重定向一定是文件操作!!!

2.文件进一步理解

打开文件本质其实进程(task_struct)打开文件(struct xxxx)

文件没有被打开时,在哪里?磁盘存在

1.进程能打开很多文件吗?可以

2.系统中可不可以存在很多进程呢??

很多情况下,os内部,一定存在大量的被打开的文件。OS要不要把这些打开的文件进行管理呢?

重点来了,讲到管理,就要先描述,在组织!!!

那预言一波可知:每一个被打开的文件,在OS内部,一定要存在对应的描述文件属性的结构体,类似PCB。

文件 = 属性 + 内容。

  7 int main()
  8 {
  9     FILE* fp = fopen("log.txt", "a");
 10     if(fp == NULL)
 11     {
 12         perror("fopen");
 13         return 1;                                                                                                                                                                    
 14     }
 15     fprintf(fp, "hello Linux!, %d", 10);
 16 
 17     fclose(fp);
 18     return 0;
 19 }

465d1ee2f3ef4d27ab61e57f57ec4672.png

 a含义:向文件中追加字符串,不会清空文件。

且追加重定向符号也可作此操作,可见重定向操作一定是文件操作!!!

c/c++/java/python访问文件的方式有些不一样!!!

3.理解文件

a.操作文件,本质:进程在操作文件。进程和文件的关系

b.文件->磁盘->外设->硬件->向文件中写入,本质是向硬件中写入->用户没有权利直接写入->OS是硬件的管理者->通过OS写入->OS必须给我们提供系统调用(OS不相信任何人)(访问文件我们也可以使用系统调用啊!)->fopen/fread/fwrite/fclose/scanf/cin/cout?->我们用的c/c++...都是对系统调用接口的封装!

为什么?怎么办?

e0d641e23cf6459292c80049e6295fe5.png

 

 认识一下系统调用并且使用。

#include<stdio.h>      
#include<unistd.h>      
#include<sys/types.h>      
#include<sys/stat.h>      
#include<fcntl.h>      
      
      
int main()      
{      
    umask(0);      
    int fd = open("bite1.txt", O_WRONLY | O_CREAT, 0666);                                                                                                                                
    if(fd < 0)    
    {    
        perror("open");    
        return 1;    
    }    
    close(fd);    
    return 0;       
} 

这是一个使用系统调用操作文件的程序,那么umask是可以设置 当前进程的掩码为0,使得我们在open第三个参数设置权限位时不会受到掩码的影响。

第二个参数是用的宏来代表是写还是读等操作,以位图的方式存储对应数据。

4f58bf918155492ba28bc8e9e0ab3e06.png

32个比特位。用比特位来进行标志位的传递。 ---- OS设计很多系统调用接口的方法。

fe5833fed9a74ab3837a993ea7ccb655.png

open: 以写的方式打开,不存在就创建,存在就先清空!

 open与fopen什么联系?

ff979fcf09ca455fb42513725e316a33.png

0:标准输入(键盘)

1:标志输出(显示器)

2:标志错误(显示器)

30dc29417ede4c628a2c97bb9fdd2a5a.png

 这些又有什么联系?

我们在进程中去打开多个文件时的open返回值从3开始依次增加是怎么回事?

文件描述符fd,fd的本质是什么?

那就说个结论吧:其实是内核的进程:文件映射关系的数组的下标!

06d3dce07626444393f28d9e1774dead.png

 我们已经理解什么是fd,0,1,2默认打开了?

0:标准输入(键盘)

1:标志输出(显示器)

2:标志错误(显示器)

硬件啊->理解Linux一切皆文件

eec8d53bf1e34b599df7a69e1db053a1.png

 struct file中有函数指针,同一个指针会指向不同的方法,这不就是我们C++学习到的面向对象中的多态吗?

那把c语言struct看做类。

如果我们用c实现类?

所以以上内容就都能贯通了,本质是c语言中的文件操作函数底层都是对系统调用接口的封装,封装了系统调用的细节。

所以就理解了Linux一切皆文件!

4.c语言为什么要这么做?

可以使用系统调用,也可以使用语言提供的文件方法

系统不同,系统调用接口可能不一样

代码就不具备平台性

所以所有的语言都想具有跨平台性!!

所有的语言要对不同的平台的系统调用进行封装

不同的语言封装的时候,文件接口就有差别了!

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

节点级、系统级、实车级的LIN测试主要差异点

文章目录 前言一、节点级1.前期准备2.测试执行 二、系统级1.前期准备2.测试执行 三、实车级1.前期准备2.测试执行 总结 前言 LIN协议一致性测试主要指的是物理层&#xff08;电阻、电容、电压、地偏移、显隐性电平、频率占空比、位时间等&#xff09;、数据链路层&#xff08;…

mysql mgr集群断电重启

一、前言 mysql mgr集群所有节点都断电重启时&#xff0c;就会面临一个问题&#xff0c;应该怎么重新构建mgr集群 二、操作 查询所有节点的master状态 show master status; 查看同步状态&#xff0c;可以通过uuid知道是通过哪个节点进行同步的数据 查看所有节点的uuid&#x…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

element el-table表格切换分页保留分页数据+限制多选数量

el-table表格并没有相关的方法来禁用表头里面的多选按钮 那么我们可以另辟蹊径&#xff0c;来实现相同的多选切换分页&#xff08;保留分页数据&#xff09; 限制多选数量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自带…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

微信AI机器人智能助手:利用大模型定制训练知识库

随着人工智能技术的迅速发展&#xff0c;AI已经渗透到了我们生活得方方面面。AI文本撰写、AI绘画、AI生成视频、AI换脸等各类应用层出不穷。作为领先的创新人工智能和元宇宙厂商&#xff0c;道可云凭借自身在人工智能、元宇宙、虚拟数字人等领域的技术积累&#xff0c;将AI技术…

文本超长省略的几种方式(vue)

第一种&#xff0c;纯css 在给容器设置宽度后&#xff0c;使用css来省略文本超长部分&#xff0c;但是这样就看不到全部的内容 <template><div class"content"><div class"text">{{ text }}</div></div> </template>&…

Vue3 登录成功,浏览器存在toke,再次访问/login路由到/index 首页页面

文章目录 目录 文章目录 流程 小结 概要流程技术细节小结 概要 首先需要清楚知道浏览器localstorage和Session storage的区别 localStorage 和 sessionStorage 是 HTML5 提供的两种客户端存储数据的方法&#xff0c;它们在使用和生命周期上有一些区别&#xff1a; 1. 生命周期…

1.回溯算法.题目

1.回溯算法.题目 题目9.子集问题10.子集||11.递增子序列12.全排列13.全排列||14.回溯算法去重问题的另外一个写法15.重新安排行程16.N皇后 总结去重方式的不同 题目 9.子集问题 &#xff08;题目链接&#xff09; 给定一组不含重复元素的整数数组 nums&#xff0c;返回该数组…

宝塔linux网站迁移步骤

网站迁移到新服务器步骤 1.宝塔网站迁移&#xff0c;有个一键迁移工具&#xff0c;参考官网 宝塔一键迁移API版本 3.0版本教程 - Linux面板 - 宝塔面板论坛 (bt.cn)2 2.修改域名解析为新ip 3.如果网站没有域名&#xff0c;而是用ip访问的&#xff0c;则新宝塔数据库的wp_o…

mysql主键自增连续新增时报错主键重复-Duplicate entry “x” for key PRIMARY

mysql主键自增连续新增时报错主键重复 1、mysql数据库设置数据库主键自增的规律 id -- AUTO_INCREMENT2、可视化工具查看自增没问题 3、问题描述 新增第一个时操作成功&#xff0c;新增第二个时候操作失败报错&#xff1a; Duplicate entry “x” for key PRIMARY4、分析&a…

[BUUCTF从零单排] Web方向 02.Web入门篇之『常见的搜集』解题思路(dirsearch工具详解)

这是作者新开的一个专栏《BUUCTF从零单排》&#xff0c;旨在从零学习CTF知识&#xff0c;方便更多初学者了解各种类型的安全题目&#xff0c;后续分享一定程度会对不同类型的题目进行总结&#xff0c;并结合CTF书籍和真实案例实践&#xff0c;希望对您有所帮助。当然&#xff0…

手把手教你考下39张免费亚马逊AWS证书和学习徽章

小李哥目前共考了39项亚马逊云(AWS)徽章&#xff0c;这也是普通用户可考的全部徽章。这篇文章会介绍如何报名、复习、通过这39张徽章提升云计算基本技能&#xff0c;了解全球第一大云厂亚马逊云科技前沿技术。这篇文章在领英爆&#x1f525;&#xff0c;有将近100k浏览量和11k的…

Linux:系统安全及应用

目录 一、系统账号管理 1.1、系统账号清理 1.2、密码安全控制 1.3、命令历史限制 二、限制su命令用户 三、PAM安全认证 四、sudo机制提升权限 4.1、sudo机制介绍 4.2、用户别名案例 4.3、启用sudo操作日志 4.4、其他案列sudo 4.5、开关机安全控制 4.6、限制更改GR…

root密码忘了怎么办(从系统引导过程解决)

目录 1.Linux系统密码忘记 2.系统引导过程 2.1 systemd 2.2 GRUB和GRUB2 2.3 运行级别 3.修复MBR扇区故障和GRUB引导故障 3.1 MBR扇区故障 3.2 GRUB引导故障 1.Linux系统密码忘记 我们在生活中经常遇到这类困扰&#xff0c;就是某个账号还是账户密码忘了&#xff0c;这…

Docker 部署 Nacos v2.3.2 版本

文章目录 Github官网文档Nacos 生态图Nacos Dockerdocker-compose.ymlapplication.propertiesNacos 官方示例 Github https://github.com/alibaba/nacos 官网 https://nacos.io/ 文档 https://nacos.io/docs/latest/what-is-nacos/ Nacos 生态图 Nacos Docker 镜像&…

《信创数据库沙龙上海站:共话发展,智启未来》

2024 年 6 月 29 日周六 14:00&#xff0c;信创数据库沙龙在上海市徐汇区建国西路 285 号科投大厦 13 楼金星厅成功举办。本次活动吸引了众多学术界和产业界的专家、学者以及技术爱好者参与。 活动中&#xff0c;多位嘉宾带来了精彩分享。薛晓刚探讨了 Oracle 在国内的前景&a…

Java全套智慧校园系统源码:微信小程序+电子班牌 让教育更智能化的一套数字化校园管理系统源码

Java全套智慧校园系统源码&#xff1a;微信小程序电子班牌 让教育更智能化的一套数字化校园管理系统源码 智慧校园管理系统是一种利用科技手段优化学校教育和管理的平台。它可以涵盖多个方面&#xff0c;例如教学、管理、服务等。其中包括智能化教室、智慧校园卡、校园安全监控…

基于flask的闪现、g对象、蓝图

【 一 】闪现&#xff08;flash&#xff09; # 1 flask中得闪现存放数据的地方&#xff0c;一旦取了&#xff0c;数据就没了-实现跨请求间传递数据 # 2 django中有没有类似的东西&#xff1f;message 消息框架# 3 基本使用1 设置&#xff1a;flash(欢迎你、欢迎来到澳门赌场&a…

Dns被莫名篡改的问题定位(笔记)

引言&#xff1a;最近发现用户的多台机器上出现了Dns被莫名修改的问题&#xff0c;从系统事件上看并未能正常确定到是那个具体软件所为&#xff0c;现在的需求就是确定和定位哪个软件具体所为。 解决思路&#xff1a; 首先到IPv4设置页面对Dns进行设置&#xff1a;通过ProcExp…