文件描述符与重定向
1. open系统调用
在 Linux 中, open() 系统调用用于打开一个文件或设备,并返回一个文件描述符,通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件,具体行为取决于传递给它的参数。
需要包含的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);
参数解释:
pathname: 要打开或创建的⽬标⽂件
flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成
flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问
权限
O_APPEND: 追加写
返回值:
成功:新打开的⽂件描述符
失败:-1
mode 参数用于设置文件权限,通常只有在使用 O_CREAT 标志时才会使用。它指定文件的新权限,控制谁可以读取、写入和执行该文件。mode 是一个表示文件权限的整数,使用常量来组合不同的权限位。常见的 mode 权限:S_IRUSR:用户可读权限。
S_IWUSR:用户可写权限。
S_IXUSR:用户可执行权限。
S_IRGRP:组用户可读权限。
S_IWGRP:组用户可写权限。
S_IXGRP:组用户可执行权限。
S_IROTH:其他用户可读权限。
S_IWOTH:其他用户可写权限。
S_IXOTH:其他用户可执行权限。
示例:
open("file.txt", O_CREAT, S_IRUSR | S_IWUSR);
这会创建一个新文件,并设置权限为文件所有者可读和可写。
也可以用二进制表示
open("myfile", O_WRONLY | O_CREAT, 00644);
文件所有者权限为读写。用户组和其他用户权限为只读。



myfile.c:
-
打开文件:
使用open()函数以只读 (O_RDONLY) 和创建文件 (O_CREAT) 的模式打开log.txt文件。如果文件不存在,O_CREAT会创建文件。若文件打开失败,程序会输出错误并返回 1。 -
读取文件:
通过read()函数从文件描述符fd中读取数据到buff中。read()函数将最多读取strlen(msg)字符(这是一个错误的参数,应该是缓冲区大小)。 -
输出内容:
如果读取成功(s > 0),则通过printf()输出读取到的内容。否则,退出循环。 -
关闭文件:
使用close()关闭文件描述符。
2. 文件描述符
2.1 文件描述符
文件描述符(File Descriptor,简称 FD)是操作系统为每个进程提供的一种标识符,用于访问打开的文件、设备或其他输入输出资源。文件描述符是一个非负整数,它在进程的文件表中对应着一个指向内核中文件信息的指针。
上面myfile.c中read之所以可以通过int类型的fd读取到long.txt文件的内容就是因为每个文件都有一个文件描述符。
文件描述符的工作原理
每个进程在打开文件时,操作系统会为该进程分配一个文件描述符。文件描述符不仅仅用于普通文件,还可以用于设备、管道和套接字等其他输入输出资源。操作系统通过文件描述符来管理文件的读写操作。
- 标准输入(STDIN):文件描述符
0,用于从用户或其他程序读取数据。 - 标准输出(STDOUT):文件描述符
1,用于向用户或其他程序输出数据。 - 标准错误输出(STDERR):文件描述符
2,用于输出错误信息。
除了标准输入、输出和错误输出外,应用程序可以打开更多文件,操作系统会为每个打开的文件分配一个文件描述符。
打开文件与文件描述符
当你调用 open() 函数打开一个文件时,操作系统会返回一个文件描述符,这个描述符可以用于后续的文件操作(如读写)。
int fd = open("example.txt", O_RDONLY);
这行代码尝试以只读模式打开 example.txt 文件,并返回一个文件描述符 fd。之后,可以使用该文件描述符来执行文件读写操作。
文件描述符的使用
在文件描述符返回后,可以通过以下系统调用来进行操作:
read(fd, buffer, size):从文件描述符fd中读取最多size字节的数据到buffer中。write(fd, buffer, size):向文件描述符fd写入size字节的数据。close(fd):关闭文件描述符,释放操作系统资源。
文件描述符表
操作系统维护一个文件描述符表,每个进程有一个独立的文件描述符表。文件描述符表的每个条目指向一个内核中的文件表,该表保存了文件的详细信息(如文件位置指针、权限等)。通过文件描述符,操作系统可以访问这些信息。
示例:打开、读取、写入和关闭文件
- 程序会从标准输入读取
Hello, World!字符串并存储到buf中。 - 标准输出:
write(1, ...)会将Hello, World!输出到标准输出(屏幕)。 - 标准错误输出:
write(2, ...)会将相同的Hello, World!输出到标准错误(通常也是屏幕,但会有不同的标记或颜色,取决于终端设置)。

程序会从标准输入读取 hello henu 字符串并存储到 buf 中。
write(1, ...) 会将 hello henu 输出到标准输出(屏幕)。
write(2, ...) 会将相同的 hello henu 输出到标准错误(通常也是屏幕,但会有不同的标记或颜色,取决于终端设置)。
2.2 文件描述符分配规则
标准文件描述符
在 Linux 和 Unix 系统中,每个进程默认会打开三个文件描述符,分别是:
这些文件描述符默认已经为进程打开,并且对应终端设备或其他输入输出流。
- 标准输入(STDIN): 文件描述符
0。 - 标准输出(STDOUT): 文件描述符
1。 - 标准错误输出(STDERR): 文件描述符
2。
从 3 开始的文件描述符
- 当一个文件第一次通过
open()打开时,它会获得文件描述符3。 - 第二个文件会分配文件描述符
4,以此类推。 -
除了标准输入、输出和错误输出外,进程还可以打开更多文件或设备。这些文件描述符的分配从文件描述符
3开始,并且会根据文件打开的顺序逐个递增。
文件描述符的分配是按顺序进行的,并且不会跳过数字。
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("myfile", O_RDONLY);9 if(fd < 0)10 {11 perror("open");12 return 1;13 }14 printf("%d\n", fd); 15 16 close(fd);17 return 0;18 }
![]()
3. 重定向
如果将标准输出(1)关闭,会发生什么呢?
1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <stdlib.h>6 7 int main()8 {9 close(1);10 int fd = open("log.txt", O_RDWR | O_CREAT, 00644); 11 if(fd < 0) 12 {13 perror("open");14 return 1;15 }16 printf("d: %d", fd);17 fflush(stdout);18 19 close(fd);20 return 0;21 }

此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中,其中,fd=1。这
种现象叫做输出重定向。常见的重定向有: > , >> , < 。
几个细节:
使用fflush close(1);: 关闭了标准输出文件描述符,导致标准输出流会失效。而 fflush 则起到了一个作用,它会强制刷新缓冲区,并把缓冲区中的数据写入到文件或终端中。
open参数:第一个0表示这是八进制,第二个零是 特殊权限设置,644分别是文件所有者、所属组、其他用户的权限。
常见的几种重定向:
>:将标准输出重定向到文件,覆盖原文件内容。
>>:将标准输出重定向到文件,追加到文件末尾。
<:将文件内容作为标准输入提供给命令。
2>:将标准错误重定向到文件,覆盖原文件内容。
2>>:将标准错误追加到文件末尾。
&>:同时将标准输出和标准错误重定向到同一个文件,覆盖原文件内容。
>&:将标准输出和标准错误输出重定向到同一个文件,功能与 &> 类似。
2>&1:将标准错误重定向到标准输出,通常用于将两者合并到同一个文件。

4. dup2系统调用
dup2 是一个在 Unix-like 操作系统中用于文件描述符复制的系统调用。它可以将一个文件描述符复制到另一个指定的文件描述符,通常用于重定向输入输出。

参数:
oldfd:现有的文件描述符,通常是一个已打开的文件或设备(如标准输入、标准输出等)。newfd:目标文件描述符。dup2会将oldfd的副本复制到newfd,并关闭newfd(如果它已经打开)。
返回值:
功能:
dup2 会将 oldfd 指向的文件或设备重定向到 newfd。
如果 newfd 已经打开,dup2 会先关闭 newfd,然后将 oldfd 的文件描述符复制到 newfd。
如果 oldfd 等于 newfd,dup2 不会做任何操作,只会返回 newfd。
1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <stdlib.h>6 #include <unistd.h>7 8 int main()9 {10 close(1);11 int fd = open("log.txt", O_RDWR | O_CREAT, 00644);//使用O_APPEND则是追加写入12 if(fd < 0)13 {14 perror("open");15 return 1;16 }17 dup2(fd, 1);18 while(1) 19 {20 char buf[1024] = {0};21 ssize_t read_size = read(0, buf, sizeof(buf) - 1);22 if(read_size < 0)23 {24 perror("read");25 return 1;26 }27 printf("%s", buf);28 fflush(stdout);29 }30 31 return 0;32 }

返回值:
- 成功时,返回
newfd,即新的文件描述符。 - 失败时,返回
-1,并设置errno。
相关文章:
文件描述符与重定向
1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备,并返回一个文件描述符,通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件,具体行为取决于传递给它的参数。 需要包含的头文件…...
为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
简短总结: 支持 GPU 加速:Tensor 提供对 GPU 的原生支持,能够有效加速计算,而 NumPy 则通常只能在 CPU 上运行。支持自动求导:深度学习模型的训练依赖于参数的优化,而 Tensor 提供了自动求导功能ÿ…...
python把html网页转换成pdf标题没有乱码,正文都乱码
在使用Python将HTML网页转换成PDF时,遇到标题没有乱码但正文乱码的问题,通常是由于字符编码处理不当或字体支持问题导致的。以下是一些可能的原因和解决方案: 原因分析 字符编码不匹配: HTML文件的编码与PDF转换工具或库所使用的…...
基于fast-whisper模型的语音识别工具的设计与实现
目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…...
详解:事务注解 @Transactional
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使用…...
场内、场外期权怎么开户?期权佣金是多少?
期权交易需要一定的知识和经验,以有效管理风险和制定策略。 场内期权开户(以50ETF为例) 场内期权开户的各种方式大差不差,咱们就先以50ETF期权为例子看下。 场内期权开户条件包括: 首先是资金的要求,50万…...
Linux:进程概念
目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程? 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al 5…...
Rabbit MQ 高频面试题【刷题系列】
文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...
破解密码防线:渗透测试中的密码攻击手法汇总
密码是网络安全中的一道重要防线,然而,若密码策略不严密,往往会为攻击者提供可乘之机。本文将简要介绍渗透测试中关于密码的几种常见攻击思路和手法。 1. 确认使用默认及常见的账号密码 在渗透测试的初期,攻击者通常会尝试使用系…...
大模型在白血病诊疗全流程风险预测与方案制定中的应用研究
目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与白血病相关知识 2.1 大模型技术原理与特点 2.2 白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据…...
5-2JVM内存的各种应用
一、堆区(Heap)——对象实例的存储池 实际应用场景: 对象实例化:所有通过 new 关键字创建的对象实例均存储在堆中。例如: java Person person new Person(“张三”); // person对象实例分配在堆区1,4,6 大对象直…...
【NLP 28、一文速通NLP文本分类任务 —— 深度学习】
目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…...
nvidia驱动更新,centos下安装openwebui+ollama(非docker)
查看centos内核版本 uname -a cat /etc/redhat-release下载对应的程序(这个是linux64位版本通用的) https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run cudnn想办法自己下一下,我这里是12.x和11.x通用的…...
UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹
视频参考:https://www.bilibili.com/video/BV1KpXSYdEdo/ 从地球观察土星的运动轨迹 从地球观察火星 轨迹 从地球观察金星的运动轨迹...
蓝桥杯 五子棋对弈
五子棋对弈 问题描述 “在五子棋的对弈中,友谊的小船说翻就翻?” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第一,比赛第二"的宗旨ÿ…...
springmvc热点面试题开胃菜
1. Spring MVC的核心组件有哪些?它们的作用是什么? 答案: Spring MVC的核心组件包括以下部分,每个组件都有其特定的作用: DispatcherServlet: 前端控制器,是Spring MVC的核心。它负责接收所有H…...
关于深度学习的一份介绍
在这篇文章中,我将介绍有关深度学习的东西,主要是它与神经网络的关系、目前主要的网络有哪些,以及加深神经网络的意义等。 一、联系 在之前的文章中,我曾介绍过神经网络,而所谓的神经网络其实就是深度学习的一种架构…...
JavaScript系列02-函数深入理解
本文介绍了JavaScript函数相关知识,包括 函数声明与函数表达式 - 解释两者的区别,提升行为,以及使用场景箭头函数特性 - 讲解语法、词法this、不能作为构造函数等特点this绑定机制 - 详细讲解四种绑定规则:默认绑定、隐式绑定、显…...
Netty是怎么实现Java NIO多路复用的?(源码)
目录 NIO多路复用实现事件循环是什么?核心源码(1)调用 NioEventLoopGroup 默认构造器(2)指定 SelectorProvider(3)创建 Selector(4)创建单线程和队列(5&#…...
SourceTree配置SSH步骤详解
1. 生成SSH密钥对 如果尚未生成SSH密钥,需先创建: Windows/macOS/Linux通用方法 打开终端(或Git Bash)。 输入以下命令(替换为你的邮箱): bash 复制 ssh-keygen -t ed25519 -C "your_em…...
Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C
Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…...
免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全
软件技术 今天要给大家分享一款超实用的 PDF 处理工具,它免费又轻巧,如同随时待命的得力小帮手,功能之强大超乎想象,真的值得大家收藏。 这款工具是绿色版软件,解压后开启,满满的 PDF 处理功能便映入眼帘…...
基于ssm的校园跑腿管理系统+vue
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…...
java数据结构_Map和Set_9.1
1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有的结点都小于根结点的值若它的右子树不为空,则右子树上所有的结点都大于根结点的值…...
横向移动靶场-Tr0ll: 3
Tr0ll: 3来自 <Tr0ll: 3 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.187 3,对靶机进行端口服务探测 …...
请解释 Node.js 中的网络模块(http、https),如何创建 HTTP服务器?
1. Node.js 中的网络模块(http 和 https) 原理与作用: Node.js 的 http 和 https 模块是内置的核心模块,用于创建 HTTP 和 HTTPS 服务器。 http 模块基于 Node.js 的事件驱动架构,利用 libuv 和 HTTP parser 库高效处…...
【WPF命令绑定之--没有Command属性的控件如何进行命令绑定?】
前言 C#WPF之命令绑定 内容 有些控件不支持直接绑定命令,可以调用其他依赖实现命令的绑定。 依赖:Microsoft.Xaml.Behaviors.Wpf 使用如下代码可以实现事件的命令绑定,及传递参数: 1、引用:xmlns:behavior“http://sch…...
记20忘10之六:line
记20忘10之六:line 胖子定律:每天坚持多咬两口,相信将来自己就是个胖子 今天,我们继续来记几个单词吧, line n.线 moral bottom line道德底线 派生、同源或相关: linear a.线的,直线的lineamen…...
【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
【系统稳定性】1.11 QVM稳定性问题分析(一)
目录 写在前面 一,qvm进程异常 1.1 进程崩溃(Coredump) 1.2 进程卡死 1.3 进程重启 二,qvm进程异常分析过程 写在前面 在QVM(Quantum Virtual Machine)作为HOST QNX的Guest,同样会遇到重启、Watchdog(看门狗)等稳定性问题。 这里我们把qvm的异常归类为两类问题…...
