Linux —— 基础IO — 文件描述符 + 重定向

目录

[4.5 文件描述符 fd](#4.5 文件描述符 fd)

[4.5.1 file对象和进程间的关系:](#4.5.1 file对象和进程间的关系:)

[4.5.2 文件描述符的分配规则](#4.5.2 文件描述符的分配规则)

[4.5.3 重定向](#4.5.3 重定向)

[4.5.3.1 以追加方式打开:](#4.5.3.1 以追加方式打开:)

[4.5.3.2 以读方式打开:](#4.5.3.2 以读方式打开:)

[4.5.4 使用 dup2 系统调用](#4.5.4 使用 dup2 系统调用)

[4.5.4.1 所以第二个重定向的版本如下:](#4.5.4.1 所以第二个重定向的版本如下:)

[4.5.4.2 追加重定向的实现:](#4.5.4.2 追加重定向的实现:)

问题1:

​编辑

问题2:

[5. 给我们历史所写的 minishell 添加 重定向功能!!!](#5. 给我们历史所写的 minishell 添加 重定向功能!!!)

[6. mini shell完整代码](#6. mini shell完整代码)


4.5 文件描述符 fd

文件描述符的本质是:进程的文件描述符表的下标

运行结果:

操作系统内只认文件描述符,所以C语言打开文件,访问文件,所对应的FILE*内部,必定封装了文件描述符,0,1,2被stdin,stdout,stderr封装了。

一个进程打开文件时的struct file,也就是每个进程在打开的时候,都会在内核里创建一个struct file,上层的语言的文件没有那么重要,在系统层面上识别一个文件只认文件描述符:fd。

4.5.1 file对象和进程间的关系:

4.5.2 文件描述符的分配规则

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

运行结果(符合预期,因为0,1,2被占用):

将0号关闭掉,不再指向对应的stdin了,此时表示0下标就可以使用了。

运行结果:(怎么什么也看不到??)

上面的验证至少证实了本来应该像显示器准输出上打印的,在转而经过将1号标准输出关闭,紧挨着创建一个新文件,就可以直接让printf打印到指定的文件中,这个工作就叫做重定向。

4.5.3 重定向

用open()打开文件,close()关闭文件的方式以此看到输出重定向和追加重定向的效果。

重定向的本质:

4.5.3.1 以追加方式打开:
4.5.3.2 以读方式打开:

此时读文件的时候就不阻塞了,因为读的时候文件中是有内容的。这个叫做输入重定向。

所以,所谓的重定向就是改0,1,2所对应的底层指向。但是每次都要进行close,此方式不是很好。

4.5.4 使用 dup2 系统调用

4.5.4.1 所以第二个重定向的版本如下:
4.5.4.2 追加重定向的实现:

那么3号原本的指向的内容还在吗?

这个结果就说明了,当我们做重定向之后,3号能够正常使用,1号也能够正常使用,两个都可以向同一个文件写,说明在做重定向时,3号是没有被关的。1号是会被系统自动关掉的。

问题1:

所以说子进程的操作是不会影响父进程的,以下是验证的代码:

运行结果:

所以第一个问题回答完毕:

问题2:

所以回答第二个问题:

用代码来验证:

5. 给我们历史所写的 minishell 添加 重定向功能!!!

重定向操作:

运行结果:

进入到我们自己写的minishell中,进行重定向操作没有没问题。

追加重定向也没问题:

照样也能输入重定向:

6. mini shell完整代码

minishell的完整代码的链接

相关推荐
星恒随风24 分钟前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
晚风叙码24 分钟前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
无足鸟ICT40 分钟前
【RHCA+】影响Linux系统性能的因素
linux·运维·服务器
论文复现现场44 分钟前
DeepSeek V4.1 Flash 和 V4 Pro 有什么区别?API 价格、性能与迁移建议
java·服务器·人工智能·python·大模型api·deepseek·deepseek v4.1
沫璃染墨1 小时前
从零入门计算机网络系列(十):HTTP协议进阶——从资源路径解析到状态码与请求头详解
linux·运维·服务器·网络·c++·http
oioihoii1 小时前
Windows部署MySpeed自建测速服务:Docker运行后直接测速,再配置固定公网地址远程查看
运维·docker·容器
小则又沐风a1 小时前
深入了解五种IO模型与非阻塞IO
linux
Sayai1 小时前
Ubuntu 开发环境搭建避坑(一):网卡 EEE 致 60% 周期性丢包,Realtek RTL8125 网络黑洞排查与修复
linux·运维·网络·ubuntu·性能优化
墨染天姬1 小时前
【linux 网络1】数据怎么进网卡到内核?
linux·运维·网络
迪康coolmu1 小时前
金融客户数据合规落地:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·数据库·经验分享·安全·网络安全·金融