Linux 研究文件描述符fd的分配规则

目标:研究fd的分配规则

方式:做实验

我们写一段代码,需要实现的功能如下:利用系统调用接口实现读入字符,并且把读入的字符打印在屏幕上。

实验1

我们需要用到read()函数。

read是系统调用接口,头文件和用法如下:

实现的代码如下:

code

运行结果:

此时我们发现,我们程序执行之后我们输什么字符都会被打印出来,最后我们回车也被以空行的形式打印出来了(回车符也是字符):

我们如果不想回车符也被打印出来,那我们就把buffer的最后一个值去掉:

 运行结果:

 为了配套,现在不用printf输出,用write()函数来输出:

实验1结论:

0,1,2只是数字,但是在这里却可以实现输入输出报错的功能,因此我们可以得出结论:


实验2

实验目的:因为上面的实验得到结论进程默认打开了0,1,2三个信号描述符,现在我们在创建文件之前手动关掉0号文件描述符,然后再去创建文件,看看此时新创建的文件的文件描述符是几号。

实验过程:

 实验结果:

发现关闭了0号文件描述符,新创建的文件描述符仍然是0号文件描述符。

现在我们再依次关闭1号文件描述符和2号文件描述符,看看会得到什么结果:

关闭1号文件描述符运行结果:

什么都没有输出(因为1号文件描述符是stdout):

关闭2号文件描述符运行结果:

通过这个实验我们可以得出一个结论:哪个文件描述符没用就会优先分配最小的那个闲置的文件描述符,结合前面实验1结论如下:

结论:

实验3

首先我们关闭文件描述符1,然后打开文件log.txt,最后我们向显示器打印出此时的fd值:

 我们发现运行完a.out之后屏幕上什么都没有打印出来,此刻我们打印文件log.txt,发现把log.txt被分配的描述符是1:

1是标准输出文件显示器的文件描述符,但是分配给文件log.txt的文件描述符确是1.

我们来看看这中间发生了什么:

因为0号文件描述符已经被用掉了,而显示器被关掉了,1号文件描述符被释放了,变为了闲置状态。而此时我们刚好创建了log.txt文件,所以1号文件描述符就被分配给了log.txt文件:

平时我们说printf()函数是向显示器上打印内容,因为printf()函数绑定的是stdout,实际上stdout绑定的是1号文件描述符1号文件描述符分配给哪个文件,printf()就向哪个文件输出内容。如果分配给显示器文件,那么就向显示器打印内容,如果分配给log.txt文件,那么就会朝log.txt文件输出内容。

这句代码是什么意思呢?:我们把这一行注释掉再执行:

 发现log.txt文件什么都打印不出来,这又是为什么呢?

首先我们的数据不会直接写到文件里,而是先读入到c语言提供的缓冲区,c语言再通过fd把数据提供给内核,但是我们代码最后执行了  close(fd);把通道给关掉了,因此数据就传不过去了,所以需要我们刷新一下:

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

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

相关文章

矩阵的正定(positive definite)性质的作用

1. 定义 注意,本文中正定和半正定矩阵不要求是对称或Hermite的。 2. 性质 3. 作用 (1)Axb直接法求解 cholesky实对称正定矩阵求解复共轭对称正定矩阵求解LDL实对称非正定矩阵求解复共轭对称非正定矩阵求解复对称矩阵求解LU实非对称矩阵求解…

假期作业5

TCP和UDP区别 TCP ----稳定 1、提供面向连接的,可靠的数据传输服务; 2、传输过程中,数据无误、数据无丢失、数据无失序、数据无重复; 3、数据传输效率低,耗费资源多; 4、数据收发是不同步的; U…

APIfox自动化编排场景(二)

测试流程控制条件 你可以在测试场景中新增流程控制条件(循环、判断、等待、分组)等。进一步满足了更复杂的测试场景/流程配置的使用,最终借助自动化测试功能解决复杂场景的测试工作。 分组​ 当测试流程中多个步骤存在相关联关系时&#xf…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

作业2.7

一、填空题 1、在下列程序的空格处填上适当的字句&#xff0c;使输出为&#xff1a;0&#xff0c;2&#xff0c;10。 #include <iostream> #include <math.h> class Magic {double x; public: Magic(double d0.00):x(fabs(d)) {} Magic operator(__const Magic&…

2024年2月11日(星期天)骑行金色螳川

2024年2月11日 (星期天&#xff0c;年初二) 骑行金色螳川(赏油菜花&#xff09;&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门囗集合 &#xff0c;家…

Redis 命令大全

文章目录 启动与连接Key&#xff08;键&#xff09;相关命令String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xff09;List&#xff08;列表&#xff09;Set&#xff08;集合&#xff09;Sorted Set&#xff08;有序集合&#xff09;其他常见命令HyperLogLog&…

【Leetcode】LCP 30. 魔塔游戏

文章目录 题目思路代码结果 题目 题目链接 小扣当前位于魔塔游戏第一层&#xff0c;共有 N 个房间&#xff0c;编号为 0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组 nums&#xff0c;其中正数表示道具补血数值&#xff0c;即血量增加对应数值&#xff1b;负数表示怪…

2024牛客寒假算法基础集训营1部分题解

// 能力有限&#xff0c;做多少发多少。 A-DFS搜索 题目描述 最近&#xff0c;fried-chicken完全学明白了DFS搜索&#xff08;如上图所示&#xff09;&#xff01;于是学弟向他请教DFS搜索&#xff0c;fried-chicken热心的进行了讲解&#xff1a; 所谓DFS搜索&#xff0c;就…

yolov8使用旋转框自己做数据集检测

主要在数据集制作&#xff0c;训练的步骤和目标检测是一样的 1.数据集标注主要使用rolabelimg工具&#xff0c;这个工具不能在线安装 得下载源代码 然后运行 标注好数据保存会是一个xml文件 2.把xml文件转换成dota的xml文件&#xff0c;然后把dota的xml文件转换成dota的txt文件…

文献速递:肿瘤分割---- 弱监督肝肿瘤分割,使用Couinaud区段标注

文献速递&#xff1a;肿瘤分割---- 弱监督肝肿瘤分割&#xff0c;使用Couinaud区段标注 01 文献速递介绍 肝癌是世界上导致癌症死亡的主要原因之一&#xff0c;也是第二大常见的癌症死因。本稿件于2021年10月28日收到&#xff0c;2021年11月24日修订&#xff0c;2021年12月1…

Qt 字符串类应用与常用基本数据类型

目录 操作字符串 查询字符串 Qt 常见数据类型 操作字符串 创建一个控制台项目 &#xff08;1&#xff09;QString提供一个二元的 “” 操作符&#xff0c;主要用于组合两个字符串。QString str1 "Hello World 传递给QString一个 const char* 类型的ASCII字符串 “He…

『 C++ - STL 』unordered_xxx系列关联式容器及其封装(万字)

文章目录 &#x1f3a1; unordered系列关联式容器&#x1f3a1; 哈希表的改造&#x1f3a2; 节点的设置与总体框架&#x1f3a2; 迭代器的封装&#x1f3a0; 迭代器的框架&#x1f3a0; operator()运算符重载&#x1f3a0; 其余成员函数/运算符重载 &#x1f3a2; 迭代器begin(…

C++之std::tuple(一) : 使用精讲(全)

相关系列文章 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 深入理解可变参数(va_list、std::initializer_list和可变参数模版) std::apply源码分析 目录 1.简介 2.std::ignore介绍 3.创建元组 3.1.…

C语言中的内存函数你知道多少呢?

目录 ​编辑 1. memcpy的使用和模拟实现 1.1函数介绍 ​编辑 1.2函数的使用 1.3模拟实现 2. memmove的使用和模拟实现 2.1函数介绍 2.2函数的使用 2.3模拟实现 3. memset函数的使用 3.1函数介绍 3.2函数的使用 ​编辑 4. memcmp函数的使用 4.1函数介绍 4.2函数…

debian12 - openssh-9.6.P1的编译安装

文章目录 debian12 - openssh-9.6.P1的编译安装概述笔记备注END debian12 - openssh-9.6.P1的编译安装 概述 在debian12上, 源码编译安装了openssl3.2 导致ssh失败. lostspeeddebian12d4x64:~$ openssl version OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2…

HCIA-HarmonyOS设备开发认证V2.0-3.轻量系统内核基础

目录 一、前言二、LiteOS-M系统概述三、内核框架3.1、CMSIS 和 POSIX 整体架构3.2、LiteOS-M内核启动流程 四、内核基础4.1、任务管理4.2、时间管理(待续)4.3、中断管理(待续)4.4、软件定时器(待续) 五、内存管理5.1、静态内存(待续)5.2、动态内存(待续) 六、内核通信机制6.1、…

从差旅申请到易快报,企业如何通过聚道云实现流程自动化?

客户介绍 深圳某有限公司是一家专注于软件开发与解决方案。公司主要提供全面的技术支持和服务&#xff0c;涵盖了多个领域&#xff0c;包括但不限于教育、企业级服务、工具类软件等。该公司产品旨在为每一所学校、每一个学生及家庭提供简单高效的编程创作体验和专业服务&#…

Linux内核与驱动面试经典“小”问题集锦(4)

接前一篇文章&#xff1a;Linux内核与驱动面试经典“小”问题集锦&#xff08;3&#xff09; 问题5 问&#xff1a;Linux内核中内存分配都有哪些方式&#xff1f;它们之间的使用场景都是什么&#xff1f; 备注&#xff1a;这个问题是笔者近期参加蔚来面试时遇到的一个问题。这…

React+Antd实现省、市区级联下拉多选组件(支持只选省不选市)

1、效果 是你要的效果&#xff0c;咱们继续往下看&#xff0c;搜索面板实现省市区下拉&#xff0c;原本有antd的Cascader组件&#xff0c;但是级联组件必须选到子节点&#xff0c;不能只选省&#xff0c;满足不了页面的需求 2、环境准备 1、react18 2、antd 4 3、功能实现 …