当前位置: 首页 > news >正文

【Linux】文件描述符1

文章目录

  • 一、简单回顾
  • 二、C系列文件接口
    • 什么是当前路径?
  • 三、直接采用系统接口
  • 四、分析系统接口及其细节,引入fd
  • 五、周边文件()
    • 缓冲区
  • stdout和stderr

一、简单回顾

  1. 文件 = 文件内容 + 属性
  2. 文件所有操作无非对内容或属性的操作
  3. 打开的文件:文件在磁盘上放着,我们访问文件的流程是:写代码 -> 编译 -> exe -> 运行 -> 访问文件;其本质就是进程在访问文件
  4. 没打开的文件:在哪里放着呢?在磁盘上放着。我们最关注什么问题?没有被打开的文件非常多。文件如何被分门别类的放置好—即我们要快速的进行增删查改—即快速的找到文件;
    所以上面的问题总结下来就是如何存储
  5. 一个文件被打开,必须先被加载到内存中!
  6. 进程 : 打开的文件 = 1:n(即一个进程可以打开任意个文件)
    由以上两点我们可以得到:操作系统内部,一定存在大量的被打开的文件! ----OS要不要管理这些被打开的文件呢? —肯定是要的,那么怎么管理呢?----先描述,在组织 ---- 所以在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。struct XXX {文件属性; struct XXX* next};
    在这里插入图片描述
  7. 显示器是硬件吗?本质和磁盘一样
  8. Linux下一切皆文件

狭义文件:磁盘上的文件
广义文件:显示器、键盘、声卡、显卡、磁盘、几乎所有外设

二、C系列文件接口

什么是当前路径?

在这里插入图片描述

#include <stdio.h>

int main()
{
    FILE* fp = fopen("log.txt","w");
    if(fp == NULL)
    {
        perror("fopen");
        return 1;
    }
    fclose(fp);
    return 0;
}

执行结果:
在这里插入图片描述

注意这里的打开文件的路径和文件名,默认在当前路径下新建一个文件。
那么这里当前路径是什么呢?其实是进程的当前路径cwd
在这里插入图片描述
当一个进程运行起来的时候,每个进程都会记录自己当前所处的路径

在这里插入图片描述
如上图输出重定向
在这里插入图片描述


三、直接采用系统接口

在这里插入图片描述

在这里插入图片描述
再看系统接口open
在这里插入图片描述

在这里插入图片描述
接下来,我们对它进行使用:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 
  6 int main()
  7 {
  8     int fd = open("log.txt",O_RDONLY);
  9     if(fd < 0)
 10     {
 11         perror("open");
 12         return -1;
 13     }
 14 
 15     //success
 16     printf("success\n");
 17     return 0;
 18 }

在这里插入图片描述
打开失败
对代码进行改变:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <fcntl.h>
  5 
  6 int main()
  7 {
  8     int fd = open("log.txt",O_RDONLY | O_CREAT);
  9     if(fd < 0)
 10     {
 11         perror("open");
 12         return -1;
 13     }
 14 
 15     //success
 16     printf("success\n");
 17     return 0;
 18 }

在这里插入图片描述
但我们发现
在这里插入图片描述
该文件的权限和平常创建文件的权限不一样;这里与umask有关;
既然文件打开了,那肯定是要关闭的,来看close:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里很好的说明了一切接文件

在这里插入图片描述

四、分析系统接口及其细节,引入fd

五、周边文件()

FILE结构体里面,必定封装了fd;
所以fd是什么?
进程要访问文件,必须打开文件!
一个进程可以打开多个文件吗·?
一般而言 进程:打开的文件 = 1 : n;
文件要被访问,前提是加载到内存中,才能直接被访问!
如果多个进程都打开多个文件,那么此时会存在大量被打开的文件!所以,OS必须把文件管理起来,采用先描述、再组织。

文件描述符的本质是数组的下标

重定向:在操作系统内部更改
在这里插入图片描述

缓冲区

刷新策略:
1.立即刷新
2.行刷新(行缓冲)
3.满刷新(全缓冲)
特殊:1.用户强制,2.进程退出

在这里插入图片描述

stdout和stderr

10.19前一个小时

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

相关文章:

  • 定制一款国密浏览器(2):修改包名
  • Java学习总结-Commons-io框架-配置io框架
  • AI比人脑更强,因为被植入思维模型【42】思维投影思维模型
  • linux服务器安装pyenv
  • 题解:AT_abc241_f [ABC241F] Skate
  • 代码随想录回溯算法01(递归)
  • 为什么AI需要连接真实世界?
  • 使用人车关系核验API快速核验车辆一致性
  • IPSG 功能协议
  • 【realtek sdk-3.4.14b】RTL8197FH-VG+RTL8812F WiFi 2.4G 功率异常问题分析及解决方案
  • MyBatis逆向工程|mybatis-generator:generate插件的使用教程
  • Linux动态监控进程利器:top命令详解
  • 【微服务】基础概念
  • Java常用数据结构操作方法全面总结
  • 二:python基础(黑马)
  • 国家重点研发计划申报答辩PPT设计制作美化ppt模板下载
  • Linux | I.MX6ULL开发板固件烧录所需文件详述(9)
  • BGP路由协议之选路原则
  • 【算法】一维前缀和与二维前缀和
  • Pod的调度
  • foobar2000 VU Meter Visualisation 插件汉化版 VU表
  • 【HFP】蓝牙Hands-Free Profile(HFP)核心技术解析
  • 20250405周赛-S
  • zookeeper基本概念和核心作用
  • Apache Arrow 使用
  • C++ atomic 原子操作
  • Superset 问题
  • 第十章: 可观测性_《凤凰架构:构建可靠的大型分布式系统》
  • 从数据流程梳理简单GPT模型各部分结构
  • [DP]多重背包