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

Linux 文件(2)

文章目录

  • 1. 文件描述符
    • 1.1 文件描述符是什么
    • 1.2 文件描述符如何分配
  • 2 重定向
    • 2.1 输出重定向
    • 2.2 输入重定向
    • 2.3 使用dup2进行重定向
  • 3. 文件、父子进程和进程替换

1. 文件描述符

1.1 文件描述符是什么

什么是文件描述符呢?

我们先来看之前所介绍的系统级别的文件操作函数open

在这里插入图片描述
在上图中,我们可以看到open有一个整型的返回值,而这个返回值,实际上就是文件描述符。

在Linux中,由进程打开文件,研究这些进程打开的文件,本质是研究文件与相应进程的关系。所以,在Linux中,会存在一个结构体用以描述文件:struct file。每一个被打开的文件,都会对应有一个struct file,这些struct file会被像双链表一样链接起来,就如task_struct一样。

而文件是由相应进程打开的,因此在描述进程的task_struct中,肯定要有记录其打开文件的变量,如下所示:

在这里插入图片描述
files这个指针指向一个files_struct的结构体,而在这个结构体中,存在一个指针数组,而这个指针数组中存放的就是一些struct file* 类型的变量,因此进程可以通过数组中存储的指针,找到其所打开的文件。

在这里插入图片描述

整体的关系可以如上图所示。

因此,文件描述符实质上就是上图中file* fd_array[]这个数组的下标。需要说明的是,操作系统识别进程打开的文件,是只通过这个文件描述符,即fd来识别的。

C语言中的FILE结构体用以描述文件,本质上是对struct file 的又一层封装,其中会存在文件描述符。

1.2 文件描述符如何分配

既然文件描述符就是数组的下标,那么文件描述符如何分派呢?

我们来看下面的测试程序:

在这里插入图片描述
上述程序的输出结果为:3
这有点奇怪,数组下标不都是从0开始的吗?这说明,0,1,2下标处,肯定对应的是别的文件。

实际上,一个进程启动时,会默认打开三个文件:标准输入stdin标准输出stdout标准错误 stderr。这三个文件,分别对应的就是数组下标0,1,2。

实际上,文件描述符是这样来分配的:返回从数组下标0开始,往后找到的第一个为空的数组下标处,即作为相应的文件描述符。

我们可以来测试一下,将标准输入文件关闭掉,然后再打开一个文件,此时这个文件的文件描述符应为0。

在这里插入图片描述
在这里插入图片描述
我们同样可以验证,进程启动时会默认打开stdin stdout stderr这三个文件,并且分配文件描述符0,1,2.

在这里插入图片描述

上述程序的输出结果为:

在这里插入图片描述
特别地,在上述代码中,我们拿到这三个文件的文件描述符是通过C语言中FILE这个结构体得到的,而在Linux中,文件描述的结构体是struct file,由此可见,C语言不仅对操作系统的接口做了封装,对操作系统的数据结构也会做封装。

2 重定向

什么是重定向呢?
正常情况下,我们输入是从标准输入中读取,而输出则是向标准输出中输出。重定向的核心就在于,使得输入不再从标准输入中读,输出不再向标准输出中输出。

2.1 输出重定向

我们先来看下面的示例:

在这里插入图片描述
我们来看上述程序的运行结果:

在这里插入图片描述
很奇怪,并没有显示出我们想要打印出的字符串。
printf函数默认是向标准输出中打印,实质上,我们前面讲过,操作系统层面,识别进程打开的文件,仅通过文件描述符实现。C语言中的printf本质是对系统调用write的封装,而write写入到哪里,正是通过文件描述符进行判定的。

因此,printf实质上是对该进程中,文件描述符为1的文件中写入,虽然我们先关闭了标准输出文件,但是新打开的文件,自动分配了文件描述符1,因此此时就会向这个新打开的文件中写入了。

我们查看一下log.txt中的结果,进行验证:

在这里插入图片描述

2.2 输入重定向

输入重定向与输出重定向是类似的。
C语言中的scanf默认是从标准输入中读取,实际上是从文件描述符为0的文件中读取。

我们通过下述代码,实现输入重定向:

在这里插入图片描述log.txt中的内容为hello linux,所以输入重定向读取一行字符串内容后,最终输出的结果也应为hello linux

最终输出结果如下所示:
在这里插入图片描述

2.3 使用dup2进行重定向

在这里插入图片描述

在这里插入图片描述

重点关注上述的dup2函数,这是一个可以实现重定向的系统调用。其原理是,让 newfd 变为oldfd 的拷贝。
比如说,我们要实现输出重定向,如果使用dup2系统调用,就不用先关掉标准输出文件,而是直接让原本存储标准输出文件的下标1处,变为存储我们要重定向到的文件。

以下,是使用dup2进行输出重定向和输入重定向的代码示例:

输出重定向:

在这里插入图片描述

输入重定向:

在这里插入图片描述

3. 文件、父子进程和进程替换

我们知道,进程打开文件,进程与文件之间是存在紧密联系的。

父进程创建子进程,子进程会继承父进程的代码和数据,子进程的task_struct也几乎是对父进程的拷贝,那么对于父进程打开的文件,子进程如何看待呢?

子进程会继承父进程打开的文件,即一个文件会对应多个进程,某文件在父进程中是打开的,那么这个文件在相应的子进程中也是打开的。
并且,在描述文件的结构体内部,存在一个引用计数,当一个文件对应多个进程时,引用计数为所对应的进程数,当一个进程关闭该文件时,引用计数便会减去1,直到引用计数为0时,该文件才会真正关闭。这也是进程具有独立性的一种体现——一个进程关闭某文件,并不会影响另一个进程对该文件的打开。

那么,进程替换中,会影响进程打开的文件吗?
答案是,不会的。进程替换,实质上并未新创建进程,而是对当前进程的代码和数据进行替换,主要更改的是进程地址空间、页表和物理内存这三者中相关映射,而进程task_struct中的其余内容并未有什么变化。
因此,某个进程在进程替换前有怎样的文件关系,在进程替换后,依然又怎样的文件关系,这是不会发生变化的。

相关文章:

Linux 文件(2)

文章目录 1. 文件描述符1.1 文件描述符是什么1.2 文件描述符如何分配 2 重定向2.1 输出重定向2.2 输入重定向2.3 使用dup2进行重定向 3. 文件、父子进程和进程替换 1. 文件描述符 1.1 文件描述符是什么 什么是文件描述符呢? 我们先来看之前所介绍的系统级别的文件…...

netcore项目使用winforms与blazor结合来开发如何按F12,可以调出chrome devtool工具辅助开发

就是像在开发网页那样,可以使用devtool工具辅助开发。可查看页面css,js等。我在网上看解决办法。没一个有用的。自己找了一个。不需要单独在页面写多余的代码 我的program.cs中有服务注册代码增加 3行代码。 #if DEBUGservices.AddBlazorWebViewDevelo…...

CSS attr() 函数详解

attr() 是 CSS 中的一个函数,用于获取 HTML 元素的属性值并在样式中使用。虽然功能强大,但它的应用有一些限制和注意事项。 基本语法 element::pseudo-element {property: attr(attribute-name); } 可用场景 1. 在伪元素的 content 属性中使用&#…...

人生如戏、戏如人生

今早,6:30起床给一家人弄早餐,然后听到了老公的一声大喊:”半小时了,你干什么了“,原来孩子说她在理书包,被老公骂了。 最近几天,老公脾气变得很差,孩子每天都会被老公骂…...

Java迭代器知识点详解

在 Java 编程中,迭代器(Iterator)是一种用于遍历集合(如 List、Set、Map 等)元素的接口。它提供了一种统一的方式来访问集合中的元素,而无需暴露集合的内部结构。以下是关于 Java 迭代器的详细知识点&#…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷

近日,苏州自动驾驶巴士线路——阳澄数谷示范线正式上线,即日起向全民免费开放试乘体验! 在苏州工业园区地铁3号线倪浜•阳澄数谷站外,一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是,小巴造型奇…...

Kotlin 协程

第一个协程程序 协程是可暂停计算的一个实例。它在概念上类似于线程,因为它需要运行一个代码块,该代码块与其他代码并发运行。然而,协程并不绑定到任何特定的线程。它可以在一个线程中暂停执行,并在另一个线程中恢复执行。 协程…...

MySQL函数触发:函数处理与触发器自动化应用

引言 各位数据库爱好者们好!今天我们要探索MySQL中两个强大的自动化工具——函数和触发器 🚀。函数就像数据库中的"瑞士军刀",能帮你高效处理各种数据;而触发器则是数据库的"自动感应器",能在数据…...

数据可视化热图工具:Python实现CSV/XLS导入与EXE打包

在数据分析工作中,热图(Heatmap)是一种非常直观的可视化工具,能够清晰展示数据矩阵中的数值分布和相关性。本文将介绍如何使用Python构建一个支持CSV/XLS文件导入、热图生成并可打包为EXE的桌面应用程序。 核心功能设计 我们的热图工具将包含以下核心功能: 支持CSV和Excel…...

CUDA Stream的进阶用法:流水线并行的资源竞争解决方案

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 引言:多任务推理场景的挑战 GPU在AI推理服务器的典型负载特征(并行模…...

Eclipse Java 开发调优:如何让 Eclipse 运行更快?

Eclipse Java 开发调优:如何让 Eclipse 运行更快? 在 Java 开发领域,Eclipse 是一款被广泛使用的集成开发环境(IDE)。然而,随着项目的日益庞大和复杂,Eclipse 的运行速度可能会逐渐变慢&#x…...

大模型(1)——基本概念

文章目录 一、大模型的定义与概念二、大模型的原理与技术核心三、大模型的应用领域四、市面上常用的大模型1. 生成类模型(文本/代码/图像)2. 理解类模型(文本/语义)3. 多模态模型4. 国产大模型 五、总结与趋势 一、大模型的定义与…...

MYSQL故障排查和环境优化

一、MySQL故障排查 1. 单实例常见故障 (1)连接失败类问题 ERROR 2002 (HY000): Cant connect to MySQL server 原因:MySQL未启动或端口被防火墙拦截。 解决:启动MySQL服务(systemctl start mysqld)或开放…...

sts下载安装

windows下STS(Spring Tools Suite,自带spring插件的eclipse)的下载与安装_sts下载-CSDN博客Spring Boot安装与配置教程_spring boot安装配置-CSDN博客...

Baklib知识中台架构设计与智能服务实践

知识中台架构四库体系解析 现代企业知识管理系统的核心在于构建结构化知识资产池,Baklib通过独创的四库体系——知识库、流程库、案例库、模型库——实现知识资源的全生命周期管理。其中,知识库作为基础层,聚合文档、图谱等显性知识&#xf…...

TinyEngine 2.5版本正式发布:多选交互优化升级,页面预览支持热更新,性能持续跃升!

前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码…...

嵌入式系统:技术演进、应用领域发展趋势全面解析

嵌入式系统:技术演进、应用领域及发展趋势全面解析 一、引言 在当今数字化时代,嵌入式系统已悄然融入到我们生活的方方面面,从日常使用的智能手机、智能家电,到汽车中的各种控制系统,乃至工业生产中的自动化设备、航…...

软件工程-项目管理

进度管理 又叫时间管理,确定进度目标,在与质量、成本目标协调的基础上,实现工期目标 具体包括以下过程: 活动定义:确定完成各项交付成果需要展开的具体活动活动排序:活动之间的先后关系和逻辑关系活动资…...

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(二)爆炸效果修改图元类型

1. 爆炸效果 这是几何着色器中的一个常见应用,我们使用几何着色器来模拟爆炸效果。 我们希望将每个三角形沿其表面法向量向外移动,则实际上是将组成环面的三角形向外“爆炸”。 我们只需取三个顶点的法向量,然后将其相加并求平均&#xff…...

需求频繁变更?AI 驱动的自动化解决方案实践

在软件开发的实际场景中,需求频繁变更已成为困扰开发团队的常见难题。每一次需求变动,都意味着代码的重新编写、调试与测试,不仅消耗大量时间和人力成本,还可能引发一系列连锁反应,影响项目进度与质量。而飞算 JavaAI …...

ffmpeg转码后的视频有横条纹和彩虹横条等乱彩问题

原因:ffmpeg安装的时,./configure 添加了–disable-asm参数,导致色彩异常。 **解决方法:**移除该参数–disable-asm。 注意:不加该参数可能提示no yasm或nasm等问题,解决该问题即可。大多是环境变量没有配置…...

QT6 源(111):阅读与注释菜单栏 QMenuBar,进行属性与成员函数测试,信号与槽函数测试,并给出源码

(1) (2) (3) (4) (5) (6) (7)以下源代码来自于头文件 qmenubar . h : #ifndef QMENUBAR_H #defi…...

达梦数据库对json字段进行操作

在达梦数据库中,字段类型不能显式定义为JSON,通常以VARCHAR或TEXT类型存储JSON字符串,可以通过内置的JSON函数对JSON格式数据进行操作和条件过滤。 1. 创建表并插入JSON数据 假设字段类型为VARCHAR,存储JSON字符串: -…...

基于vue框架的东莞市二手相机交易管理系统5yz0u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,相机分类,二手相机 开题报告内容 基于FlaskVue框架的东莞市二手相机交易管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着数字技术的迅猛发展和摄影文化的广泛普及,相机已成为人们记录生活、表达创意的重要工…...

谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频

近期,谷歌旗下的 NotebookLM 即将推出一项令人瞩目的新功能 ——Sparks 视频概览。这一功能借助 Gemini 与 Deep Research 的强大能力,能够生成 1 - 3 分钟的 AI 视频,为用户带来全新的内容创作与信息获取体验。 NotebookLM:AI 笔…...

MCP详解

前言:AI能力跃迁的“最后一公里” 当前,大语言模型(LLMs)已展现出文本生成、逻辑推理等通用能力,但其与真实世界的交互仍存在瓶颈。传统模式下,开发者需为每个外部工具(如数据库、API、文件系统)编写定制化接口,导致开发周期长、兼容性差、安全风险高。而​​模型上下…...

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539:简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 模板题及讲解:洛谷 P3374 【模板】树状数组 【解题思路】 解法1:树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…...

设计模式-面试题

摘要: 1、通俗易懂,适合小白 2、仅做面试复习用,部分来源网络,博文免费,知识无价,侵权请联系! 1. 什么是设计模式? 设计模式是在软件开发过程中,针对反复出现的问题所…...

upload-labs靶场通关详解:第11关

一、分析源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array("php","php5","php4","php3","php2","html","htm","phtml"…...

excel:时间戳格式与日期格式的互转

13位时间戳转日期时间(毫秒) 假设A2单元格内容为13位的时间戳,再选中B2单元格,在公式框中输入 TEXT((A2/10008*3600)/8640070*36519,"yyyy/mm/dd hh:mm:ss.000")接下来,选中B2单元格,下拉应用公…...

嵌套式向量中断控制器(NVIC)

1.概述 2. NVIC 的中断处理机制 3. NVIC 中断管理机制 1.概述 中断控制器是ARMv7-M 异常模型的核心组成部分。该中断控制器的运行遵循 ARM 通用中断控制器(GIC)规范,该规范也适用于其他 ARMv7 架构配置和其他处理器架构。 ARMv7-M 的 NVIC(嵌套向量中断控制器)架构支持最…...

2025.05.19【Barplot】柱状图的多样性绘制

Custom color A few examples showing how to custom barplot color. Horizontal barchart It makes sense to make your barchart horizontal: group labels are now much easier to read 文章目录 Custom colorHorizontal barchart 探索Barplot的奥秘Barplot基础什么是Barp…...

MongoDB的管道聚合

管道聚合可以实现很多数据处理和统计功能&#xff0c;并且随着不断的更新&#xff0c;其功能也越来越丰富。代表着NoSQL数据库的一种发展趋势。 管道聚合通过aggregate语句实现&#xff0c;支持多种匹配、处理、输出方式。 其语法是&#xff1a; db.<collection>.aggr…...

基于 STM32 的自动温度巡检小车控制系统设计与实现

一、引言 在工业监控、仓储管理及环境监测等场景中,自动温度巡检系统具有重要应用价值。本文设计一种基于 STM32 单片机的自动温度巡检小车,通过集成温度采集、路径规划及数据处理功能,实现对目标区域的实时温度监测与异常报警,为智能化环境监控提供低成本解决方案。 二、…...

怎么利用JS根据坐标判断构成单个多边形是否合法

怎么利用JS根据坐标判断构成单个多边形是否合法 引言 在GIS(地理信息系统)、游戏开发、计算机图形学等领域,判断一组坐标点能否构成合法的简单多边形(Simple Polygon)是一个常见需求。合法多边形需要满足几何学上的基本规则,本文将详细介绍如何使用JavaScript实现这一判…...

20. 自动化测试框架开发之Excel配置文件的IO开发

20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本&#xff08;支持xlsx格式&#…...

高校快递物流管理系统设计与实现(SpringBoot+MySQL)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

python-leetcode 67.寻找两个正序数组中的中位数

题目&#xff1a; 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。请找出并返回这两个正序数组的中位数。 通过双指针和二分查找的思想&#xff0c;找到两个有序数组的中位数。 1.初始化和基本情况处理 首先获取两个个数组的长度m和n,计算…...

Python 实现图片浏览和选择工具

实现将截图预览&#xff0c;并按照顺序加入一个pdf文件中&#xff0c;实现照片管理尤其对于喜欢看教程截图做笔记的网友们。 C:\pythoncode\new\python-image-pdf-processor.py 界面展示 &#x1f9f1; 一、核心结构概述 主类 ImageViewer(wx.Frame) 是主窗口类&#xff0c;…...

V4L2应用程序开发-01数据采集流程

1 数据采集流程 可以参考这些文件&#xff1a; mjpg-streamer\mjpg-streamer-experimental\plugins\input_control\input_uvc.c video2lcd\video\v4l2.c Video for Linux two(Video4Linux2)简称V4L2&#xff0c;是V4L的改进版。V4L2支持三种方式来采集图像&#xff1a;内存…...

TDengine 2025年产品路线图

TDengine OSS 之 2025 年年度路线图如下表所示。 季度功能2025Q1 虚拟表查询能力&#xff1a;REGEXP、GREATEST、LEAST、CAST 函数支持判断表达式、单行选择函数的其他列值、INTERP 支持插值时间范围存储能力&#xff1a;支持将查询结果写入超级表、超级表支持 KEEP 参数、STM…...

Unreal 从入门到精通之SceneCaptureComponent2D实现UI层3D物体360°预览

文章目录 前言SceneCaptureComponent2D实现步骤新建渲染目标新建材质UI控件激活3DPreview鼠标拖动旋转模型最后前言 我们在(电商展示/角色预览/装备查看)等应用场景中,经常会看到这种3D展示的页面。 即使用相机捕获一个3D的模型的视图,然后把这个视图显示在一个UI画布上,…...

windows服务器部署jenkins工具

sjenkins作为一款构建发布工具&#xff0c;极大的简化了大家项目部署发布流程。jenkins通常是部署在linux服务上&#xff0c;今天给大家分享的是windows服务器上如何搭建jenkins发布工具。 1.首先第一步还是看windows安装docker 这篇文章哈&#xff0c;当然也可以不采用docker…...

Java—— File详解

说明 File对象就表示一个路径&#xff0c;可以是文件的路径、也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也允许是不存在的 获取File对象 方法名称说明public File(String pathname)根据文件路径创建文件对象public File(String parent,String child)根据父路径名…...

「NameCraft · 幻想命名器」开发记:我和 CodeBuddy 的一次奇幻共创之旅

起心动念&#xff1a;我想做一个不一样的名字生成器 最近我有一个脑洞&#xff1a;能不能做一个风格化强烈的名字生成器&#xff1f;不要那种平平无奇的「小明、小红」类型&#xff0c;而是支持「幻想风」「武侠感」「赛博感」的那种&#xff0c;最好还有高颜值的 UI&#xff…...

03 接口自动化-精通Postman之接口鉴权,接口Mock,接口加解密以及接口签名Sign

文章目录 一、接口鉴权&#xff08;鉴定是否有访问接口的权限&#xff09;1、cookie&#xff0c;session&#xff0c;token鉴权。2、Postman的鉴权方式 二、接口Mock Sersver三、接口的加解密四、接口签名sign&#xff08;接口鉴权的一种&#xff09;1.什么是接口签名&#xff…...

深入浅出IIC协议 -- 第二篇:FPGA数字接口设计方法论

第二篇&#xff1a;FPGA数字接口设计方法论 副标题 &#xff1a;从状态机到跨时钟域——打造工业级I2C控制器的设计密码 1. 状态机设计黄金法则 1.1 状态机类型抉择 Mealy与Moore对比实验 &#xff1a; 类型输出依赖时序特性I2C适用场景Moore仅当前状态延迟稳定协议主状态控…...

20250519使用TF卡将NanoPi NEO core开发板刷机为Ubuntu core22.04.3系统完成之后执行poweroff自动关机

1、h3-sd-friendlycore-xenial-4.14-armhf-20210618.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5_WinE…...

什么是USB的EHCI和OHCI

USB的EHCI和OHCI是两种不同的主机控制器接口标准&#xff0c;用于规范计算机如何通过硬件和软件与USB设备通信。它们分别对应不同的USB协议版本和设备类型&#xff0c;以下是详细解析&#xff1a; 1. OHCI&#xff08;Open Host Controller Interface&#xff09; • 定位&…...

【2025最新版】Origin安装教程 - 超详细Origin2024中文版图文教程(保姆级附带Origin安装包)

文章目录 前言Origin安装前的必要准备Origin安装包获取Origin安装图文步骤第一步&#xff1a;解压安装包第二步&#xff1a;启动安装程序第三步&#xff1a;安装向导操作第四步&#xff1a;填写注册信息第五步&#xff1a;选择安装位置第六步&#xff1a;功能选择与安装第七步&…...