Linux中文件描述符与重定向的深入探索

目录

1. 理解C语言的文件操作函数

2. 操作系统的文件操作接口

3. 文件描述符详解和其内核本质

4. 如何理解Linux下一切皆文件

5. Linux中的重定向

5.1 输出重定向

5.2 追加重定向

5.3 输入重定向

6. 结合文件描述符理解重定向

 7.重定向的系统调用


在Linux操作系统中,文件描述符和重定向是处理文件输入/输出(IO)操作的两个核心概念。本文将深入探讨这两个概念,帮助您更好地理解它们的工作原理以及在实际应用中的使用。

1. 理解C语言的文件操作函数

在C语言中,文件操作是通过一系列函数来实现的,如fopenfclosefreadfwrite等。这些函数提供了创建、打开、读取、写入和关闭文件的基本功能。然而,这些函数只是操作系统提供的文件操作接口的一种封装。实际的文件操作是由操作系统内核来完成的。

2. 操作系统的文件操作接口

操作系统为应用程序提供了一组统一的文件操作接口,使得应用程序可以以相同的方式处理各种类型的文件,包括普通数据文件、设备文件、网络套接字等。这种统一的处理方式大大简化了程序设计和开发的复杂性。

操作系统的文件操作接口是连接上层应用软件和底层硬件的桥梁,它屏蔽了底层硬件的细节,使得用户可以通过程序(应用软件)直接对计算机中的文件进行各种操作。

文件操作接口提供了丰富的功能,使用户可以对文件进行创建、打开、读取、写入、删除、重定位等操作。这些操作通常通过系统调用的方式实现,而用户无需关心底层硬件是如何实现这些功能的。

以下是一些常见的文件操作接口及其功能:

  • 打开文件:在对文件进行读取或写入之前,需要先通过系统调用(如open)打开文件。打开文件时,操作系统会检查文件的访问权限,并为该文件分配一个文件描述符,以便后续操作。

返回值:返回一个整数fd,如果是-1则代表打开失败,fd>0则表示成功,且用户通过fd来操作文件

参数:

pathname:(文件路径)+文件名 , 如果只有文件名则表示该文件在当前路径

flags:按位图方式传递信息,有如下选项,通过按位或叠加想要的效果

  • 读取文件:通过调用读取系统调用(如read),可以将文件的内容读取到程序的缓冲区中。读取操作可以根据需要读取文件的全部内容或部分内容。

在fd指向的文件中拷贝count字节的数据到buf中

  • 写入文件:通过调用写入系统调用(如write),可以将程序缓冲区中的数据写入到文件中。写入操作可以追加到文件的末尾,也可以覆盖文件的现有内容。

把buf中count字节的数据拷贝到fd指向的文件中

  • 删除文件:通过调用删除系统调用(如unlinkremove),可以删除文件系统中的指定文件。删除文件时,操作系统会释放与该文件相关的所有资源。
  • 文件重定位:通过调用文件重定位系统调用(如lseek),可以改变文件的读写指针位置,从而实现对文件的任意位置进行读写操作。

这些文件操作接口通常都以函数的形式提供,用户只需要知道函数的功能和调用方式,就可以直接调用这些函数来操作文件,而无需关心底层硬件的实现细节。

举例来说,假设我们有一个文本文件example.txt,我们想要读取其中的内容。我们可以使用以下步骤通过文件操作接口来实现:

  1. 使用open系统调用打开文件example.txt,并获取其文件描述符。
  2. 使用read系统调用通过文件描述符读取文件的内容到程序的缓冲区中。
  3. 对读取到的内容进行处理或显示。
  4. 使用close系统调用关闭文件描述符,释放资源。

通过这个过程,我们可以轻松地实现对文件的读取操作,而无需关心底层硬件是如何进行磁盘读写等操作的。这就是操作系统文件操作接口的重要作用之一。

3. 文件描述符详解和其内核本质

在Linux中,文件描述符是一个非负整数,用于在内核中唯一标识一个打开的文件或设备。当程序打开一个文件或设备时,操作系统会为其分配一个文件描述符。文件描述符是内核中打开文件表的一个索引,通过这个索引,内核可以跟踪和管理每个打开的文件或设备的状态和信息。

文件描述符其实就是数组下标,哪个数组?文件描述符表这个数组,它是个指针数组;

访问文件的对象是进程,进程通过系统调用接口,先把文件打开,为了方便管理每个打开的文件,操作系统会为每个打开的文件创建一个文件结构体(先描述,再组织),通过对struct file这一串数据结构的增删查改从而实现对文件系统的管理,文件是由进程打开的,所以文件和进程是有关系的,但是,为了把文件管理和进程管理解耦合,操作系统通过一个结构体struct file_struct中的struct file* fd_array[ ] 来把进程和其打开的文件联系起来,这个指针数组就是文件描述符表,这个数组对应的数组下标就是文件描述符。

每个进程都会有一个文件描述符表,表中0、1、2位置默认是已经被使用了,里面分别存储了指向标准输入(键盘)、标准输出(屏幕)、标准错误(屏幕)这三个文件的指针

4. 如何理解Linux下一切皆文件

在Linux中,将一切事物都看作文件的原理基于其统一的接口设计和内核中的数据结构。这种设计哲学极大地简化了操作系统的设计和编程工作,使得设备驱动、进程间通信(IPC)和其他系统资源都可以像文件一样被访问和操作。

对于每个被视为文件的对象,Linux内核中都会为其创建一个struct file结构体实例。这个结构体包含了与该文件对象相关的所有信息,比如文件类型、文件位置、访问权限等。更重要的是,struct file结构体中包含了一组函数指针,这些函数指针指向了实现文件操作的具体函数。

这些函数指针的实现根据文件类型的不同而有所不同,从而实现了多态的效果。例如,对于普通文件,这些函数指针可能指向实现文件读写、定位等操作的函数;而对于设备文件,这些函数指针则可能指向实现设备驱动操作的函数。

通过这种方式,Linux内核能够将不同类型的文件对象统一起来,通过相同的接口进行访问和操作。无论是读取磁盘上的数据、向打印机发送数据,还是进行进程间通信,都可以使用相同的系统调用和文件操作函数。这种统一的处理方式极大地提高了Linux系统的灵活性和可扩展性。

需要注意的是,虽然从用户空间的角度来看,所有事物都像文件一样被处理,但在内核空间中,这些对象实际上是通过不同的数据结构和机制来实现的。struct file只是其中的一个关键组成部分,它与其他内核数据结构(如struct inodestruct file_operations等)共同协作,实现了Linux中文件系统的强大功能。

5. Linux中的重定向

重定向是Linux中一种强大的IO处理机制,它允许我们将命令的标准输入、标准输出或标准错误输出重定向到其他位置,如文件、其他命令或设备。

5.1 输出重定向

输出重定向是将命令的标准输出重定向到文件或其他命令。例如,使用>符号可以将命令的输出重定向到一个文件

echo "Hello, World!" > output.txt

这会将字符串"Hello, World!"写入到output.txt文件中,而不是输出到终端,而且是覆盖式输出!

5.2 追加重定向

追加重定向与输出重定向类似,但它会将输出追加到文件的末尾,而不是覆盖文件内容。这可以通过>>符号来实现:

echo "Another line." >> output.txt

这会将字符串"Another line."追加到output.txt文件的末尾。

5.3 输入重定向

输入重定向则是将命令的标准输入重定向到文件或其他命令。例如,使用<符号可以将文件的内容作为命令的输入:

cat < input.txt

这会将input.txt文件的内容作为cat命令的输入,并在终端上显示。

6. 结合文件描述符理解重定向

在Linux中,标准输入、标准输出和标准错误输出分别对应文件描述符0、1和2。重定向操作实际上就是改变这些文件描述符的指向。例如,输出重定向实际上是将文件描述符1(标准输出)重定向到指定的文件或设备。

结合例子:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
 
int main()
{
 close(1);
 int fd = open("myfile", O_WRONLY|O_CREAT, 00644);
 if(fd < 0){
 perror("open");
 return 1;
 }
 printf("fd: %d\n", fd);
 fflush(stdout);
 
 close(fd);
 exit(0);
}

代码中,先是关闭了标准输出,然后要打开一个文件,通过文件描述符分配规则(分配空闲中最小的),此时会把1分配给这个刚打开的文件myfile,那么printf是通过stdout输出的,stdout是C语言封装的一个结构体FILE*,内部封装了fd=1,所以它还是会通过fd=1来找到要输出的文件,从而在myfile中输出数据。

所以重定向的原理其实就是用户层被封装的fd不变,操作系统内核内fd指向已经变了,从而通过改变不同的指向来实现输入、输出、追加重定向。

 7.重定向的系统调用

重定向在底层是通过系统调用来实现的。在C语言中,我们可以使用dup2close等系统调用来改变文件描述符的指向,从而实现重定向的功能。这些系统调用允许程序在运行时动态地改变IO流的方向,从而实现了灵活的文件处理机制。

总结:

文件操作主要由进程完成,这些进程通过操作系统来打开、处理和关闭文件。由于涉及到操作系统,我们引入了系统调用和文件描述符等概念。在OS内核中,文件的管理遵循“先描述,再组织”的原则。为了实现用户层的输入/输出重定向,我们利用用户层和内核层数据的不一致性,修改内核层中文件描述符的指向实现重定向功能

简而言之,进程通过系统调用和文件描述符与操作系统交互,实现对文件的操作,并可通过修改文件描述符的指向实现重定向功能。

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

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

相关文章

springboot整合mybatis-plus模版

1.创建springboot项目 Maven类型Lombok依赖Spring Web 依赖MySQL Driver依赖pom.xml&#xff1a;<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/…

上门废品回收小程序,互联网回收拥有哪些特点?

随着社会的进步&#xff0c;人们的生活水平不断提高&#xff0c;产生的可回收物也在不断上升&#xff0c;每年垃圾站都能产生大量的可回收物&#xff0c;这也造成了资源的浪费。 目前&#xff0c;加快发展回收模式&#xff0c;提高我国回收效率成为了当下回收市场发展的重要方…

[笔试强训day04]

文章目录 WY22 Fibonacci数列NC242 单词搜索BC140 杨辉三角 WY22 Fibonacci数列 WY22 Fibonacci数列 #include<iostream> #include<cmath>using namespace std;int n;int main() {cin>>n;int a0,b1,c1;while(n>c){ab;bc;cab;}int ansmin(n-b,c-n);cout&l…

windows mysql8 安装后 提示密码不对,修改下密码认证方式就可以了

Windows上安装MySQL8后提示密码不对的问题可以通过以下步骤解决&#xff1a; 安装MySQL8 首先&#xff0c;你需要下载并安装MySQL8。你可以从MySQL官方网站下载符合你操作系统版本的安装包。 安装地址是&#xff1a;MySQL :: Download MySQL Installer 安装过程中&#xff…

ACRN Intel推出的虚拟机是啥样的?

前言 ACRN作为Intel为工控领域推出的一个小型化的虚拟机&#xff0c;它的特点主要有这么几个&#xff1a; 1.针对Intel的芯片做了非常强的优化 2.RT-VM实时虚拟机的实时性很好 3.CACHE缓存技术发挥的好 4.TCC技术 / 当然不是所有intel的芯片都支持&#xff0c;&#xff0c…

鸿蒙(HarmonyOS)性能优化实战-多线程共享内存

概述 在应用开发中&#xff0c;为了避免主线程阻塞&#xff0c;提高应用性能&#xff0c;需要将一些耗时操作放在子线程中执行。此时&#xff0c;子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型&#xff0c;具有内存隔离的特性&#xff0c;所以跨线…

产品规划|如何从0到1规划设计一款产品?

我们要如何从0到1规划设计一款产品?在前期工作我们需要做什么呢?下面这篇文章就是关于此的相关内容,大家一起往下看多多了解了解吧! 一、什么是产品规划? 产品规划是一种策略,它设定了产品的价值和目标,并确定实施方案以实现这些目标。它考虑了产品的整个生命周期,基于…

[RTOS 学习记录] 工程管理工具make及makefile

[RTOS 学习记录] 工程管理工具make及makefile 这篇文章是我阅读《嵌入式实时操作系统μCOS-II原理及应用》后的读书笔记&#xff0c;记录目的是为了个人后续回顾复习使用。 前置内容&#xff1a; 开发工具 Borland C/C 3.1 精简版 文章目录 1 make 工具2 makefile 的内容结构3…

【学习笔记二十四】EWM补货策略和自动补货配置

一、EWM补货策略概述 1.计划补货 ①以联机或批处理模式启动 ②根据最大和最小数量计算补货 ③仅当库存量低于最低数量时才开始 ④四舍五入至最小补货数量的倍数 2.自动补货 ①在WT确认期间启动 ②根据最大和最小数量计算补货 ③只有当库存量低于最低数量时才开始 ④四舍…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

翻页电子图书制作小技巧分享给你

当今社会&#xff0c;二维码已经成为了信息传递的重要方式之一&#xff0c;其在电子商务、广告营销、活动推广等领域广泛应用。而如何将二维码巧妙地融入电子画册中&#xff0c;制作出高端、具有吸引力的作品&#xff0c;成为了许多设计师和营销人员关注的焦点 但是很多人却不知…

ABeam×StartUp丨蓝因机器人访问ABeam旗下德硕管理咨询(深圳)新创部门,展开合作交流

近日&#xff0c;深圳蓝因机器人科技有限公司&#xff08;以下简称“蓝因机器人”&#xff09;创始人陈卜铭先生来访ABeam旗下德硕管理咨询&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“ABeam-SZ”&#xff09;&#xff0c;与新创部门展开合作交流。 交流中&am…

六西格玛管理培训:我的转变与成长之旅

4月初&#xff0c;我参与了天行健咨询的六西格玛管理培训&#xff0c;这次经历不仅极大地提升了我的工作效率&#xff0c;还帮助我在工作中实现了卓越。现在&#xff0c;我想分享一些我在这次培训中的学习心得和实践经验&#xff0c;希望能对正在寻求提升绩效和卓越之路的大家有…

【无线通信】OQPSK

调制 sps 8; RolloffFactor 0.2; FilterSpanInSymbols 10;bits randi([0, 1], 224*8, 1); % 1792symbols bits*2 - 1; % 1792 re -symbols(2:2:end); % 896 im -symbols(1:2:end); % 896pFilterTx comm.RaisedCosineTransmitFilter(...Shape, Square root, ...Rollo…

MySQL主从结构搭建

说明&#xff1a;本文介绍如何搭建MySQL主从结构&#xff1b; 原理 主从复制原理如下&#xff1a; &#xff08;1&#xff09;master数据写入&#xff0c;更新binlog&#xff1b; &#xff08;2&#xff09;master创建一个dump线程向slave推送binlog&#xff1b; &#xff…

GoJudge环境部署本地调用云服务器部署go-judge判题机详细部署教程go-judge多语言支持

前言 本文基于go-judge项目搭建&#xff0c;由于go-judge官网项目GitHub - criyle/go-judge: Sandbox Server in REST / gRPC API. Based on Linux container technologies.&#xff0c;资料太少&#xff0c;而且只给了C语言的调用样例&#xff0c;无法知道其他常见语言比如&am…

Python基础06-日期和时间的操作方法

在Python中处理日期和时间是编程中常见的需求&#xff0c;无论是安排任务、记录日志还是分析数据。本文将介绍如何在Python中获取当前日期和时间、创建特定日期和时间、格式化日期和时间、解析字符串中的日期和时间、使用时间差、比较日期和时间、从日期/时间中提取组件、处理时…

uni-app开发canvas绘图画画,如何实现后退功能

在uni-app中使用canvas进行绘图时&#xff0c;实现后退功能通常意味着你需要保存用户的每一步操作&#xff0c;然后提供一个机制来撤销最近的步骤。下面是一个基本的实现思路&#xff1a; 保存绘图步骤&#xff1a; 每当用户在canvas上绘制时&#xff08;比如通过touchMove事件…

出海不出局 | 小游戏引爆高线市场,新竞争态势下的应用出海攻略

出海小游戏&#xff0c;出息了&#xff01; 根据 Sensor Tower 近期发布的“2024 年 3 月中国手游收入 TOP30”榜单&#xff0c;出海小游戏在榜单中成了亮眼的存在。 其中&#xff0c;《菇勇者传说》3 月海外收入环比增长 63%&#xff0c;斩获出海手游收入增长冠军&#xff0c…

学习经验分享【33】YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR 基于 Pyside6 的图形化界面

大论文可以写两章关于算法创新模型&#xff0c;最后一章可以写对前两章提出方法进行封装&#xff0c;利用PyQT5搭建YOLOv5可视化界面&#xff0c;并打包成exe程序&#xff0c;构建检测平台实现简单的应用。用来凑大论文的字数和工作量&#xff0c;是简单又快速的方法&#xff0…