讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

初识Linux · 文件(2)

小辰吖_1648

小辰吖_1648

发布时间:2025-06-20 13:30:12

|

246人浏览过

|

来源于php中文网

原创

前言:

由前文文件(1)的介绍,我们引出了三个问题:

这是我们文件一里面引发的问题,那么在文件(2)里面呢,我们通过对文件深层次的理解,就会知道,以上三个问题的答案了。

那么现在,我们就进入主题吧。

文件描述符fd

我们再看一眼open函数和write函数:

初识Linux · 文件(2)

返回值的描述是:返回值新的文件描述符,如果出错了返回的是-1。

那么我们研究的是这个返回值。

首先,我们知道打开文件的是进程,而非我们,那么文件的集中管理,实际上是由进程的task_struct有一个文件指针,struct file_struct* files,指向的一块文件结构体->struct files_struct,对于该结构体而言,管理的是另一个结构体,即由文件组成的结构体,它们之间的连接方式是双向链表的方式。

初识Linux · 文件(2)

就像这样,那么file_struct和file,两个结构体之间是如何产生联系的呢?

此时,文件描述符就出场了:

初识Linux · 文件(2)

files_struct里面有一块空间,通过下标访问,而下标指向的,就是一个一个的struct file。所以每次拿到了fd之后,就能对文件进行操作。

但是光这样,好像对文件理解并没有加深多少。

我们写的数据在哪里呢?

我们使用函数,里面的数据是放在哪里呢?难道是有了文件描述符fd我们就可以直接对files结构体操作了?不是的,因为文件存储的地方是在磁盘上,而非OS里面,所以我们一定是会和磁盘扯上一定关系的,那么:

初识Linux · 文件(2)

在OS里面有一块空间,缓存空间,将数据加载到了缓存里面,此时没有出错,就可以对文件,也就是已经先描述再操作的的文件对象里面,将数据进行写入即可。

那么我们简单总结上面的过程就是:

文件 = 属性 + 内容,我们要修改内容,也就是要和外设打交道,那么需要OS层面管理。为了修改外设的属性,所以需要类似驱动程序操作,此时OS层面的进程,也就是打开文件的软件,加上管理文件的多个结构体,结合文件描述符fd进行操作。

那么系统调用函数open整个过程要干的事就是:

1 创建文件file 2 开辟文件缓冲区 加载文件数据 3 查找对应的文件描述符fd 4 通过file地址将数据移动 5 返回下标。


默认的三个流

文件描述符fd我们已经理解了,根据上文012是默认打开的三个流:0 对应的标准输入,1对应的标准输出,2对应的标准错误,输入比如键盘,输出和错误都是对应的显示器。

Linux Security Scanner
Linux Security Scanner

Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...

下载

那么不同的外设,输入输出都应该有自己的一套体系,或者说有对应的函数,但是函数名往往都是不相同的,在OS层面如何进行集中管理呢?

在OS层面存在一种结构叫做:VFS,即virtual file system。

因为每个file对象,都有一个函数指针,虽然函数名不同,但是可以将函数的参数,返回值等弄的大差不差呗。此时,访问对应的外设,OS层面可以通过VFS层,对不同的外设进行访问。

可是我们说了这么多,如何证明呢?

我们可以用file对象里面的一个变量证明,_fileno,返回值就是对应的文件描述符,而C语言的FILE指针,本质是经过typedef的,封装的是系统里面的file,所以FILE指针直线的对象肯定也是有_fileno的,我们使用如下代码证明:

代码语言:javascript代码运行次数:0运行复制
int main(){    FILE* fp = fopen("log.txt","w");    printf("fp->%d\n",fp->_fileno);    printf("stdin->%d\n",stdin->_fileno);    printf("stdout->%d\n",stdout->_fileno);    printf("stderr->%d\n",stderr->_fileno);    return 0;}
初识Linux · 文件(2)

此时,证明完毕。


最后总结

由上文可以得出,高级语言想要使用文件描述符fd,一定是会经过封装的,不然对于外设层面是没有办法使用的。

那么,既然显示器也是个文件,我们不妨尝试对显示器这个文件进行写入,前提是我们如何知道显示器的文件在哪里呢?

我们可以进入到根目录的dev,dev代表设备,其中:

初识Linux · 文件(2)

dev目录里面的三个流也是间接证明了。

初识Linux · 文件(2)

同时,我们进入到pts目录,再开一个终端,就会发现:

初识Linux · 文件(2)

也就是说,新开的终端的文件是5号,那么,我们可以:

代码语言:javascript代码运行次数:0运行复制
int main(){    int fd = open("/dev/pts/5", O_WRONLY|O_APPEND);    if(fd < 0) return 1;    const char *message = "hahaha\n";    while(1)    {        write(fd, message, strlen(message));        sleep(1);    }    close(fd);    return 0;}
初识Linux · 文件(2)

此时,就在一直打印了。

所以,高级语言的所有文件操作函数,都是对系统调用的封装!!

那么,我们之后是推荐使用高级语言的函数还是系统调用呢?

当然是高级语言的了,因为系统调用的函数不具有跨平台性!!

文件我们也算是理解了部分了,下文之后,就是应用层面的了,比如重定向,比如语言级别的缓冲区。

感谢阅读!

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5414

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5591

2025.07.04

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

3372

2023.09.26

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4530

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3793

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

3113

2023.06.30

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman安装指南
Postman安装指南

共0课时 | 0人学习

DBeaver官方文档中心
DBeaver官方文档中心

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn