返回顶部
首页 > 资讯 > 操作系统 >[Linux打怪升级之路]-重定向
  • 870
分享到

[Linux打怪升级之路]-重定向

开发语言linux运维服务器 2023-09-03 13:09:39 870人浏览 安东尼
摘要

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。  目录 一、文件描述符 1、初识文件描述符  2、文件描

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

如果觉的博主的文章还不错的话,还请点赞,收藏,关注支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 

目录

一、文件描述符

1、初识文件描述符 

2、文件描述符的分配规则

二、重定向

1、认识重定向

2、重定向的接口函数dup2

3、二种重定向 



本期学习目标:知道什么是文件描述符, 了解文件描述符的分配规则,认识重定向。

一、文件描述符

1、初识文件描述符 

我们在学习打开文件的接口open函数时,他的返回值就文件描述符,当时我们认为他是一个小的整数。

眼见为实,而听为虚,验证一下:

#define  _CRT_SECURE_NO_WARNINGS#include#include#include#includeint main(){int fd = open("add.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd < 0){perror("open");return 1;}//在显示器中打印fd的值fprintf(stdout, "open fd: %d\n", fd);close(fd);return 0;}

 这样我们就验证了fd是一个小的整数,但是这个文件描述符有什么用呢?对应open函数来说,成功打开文件就返回fd,失败就返回-1。

对于文件描述符的用处,这里我们就不得不提操作系统是如何管理文件的,要管理文件也就是要管理进程,而要管理一个进程一般都是先描述,在组织;当我们打开一个文件,操作系统就要创建相应的数据结构来管理文件,在task_struct结构体中就有一个file*的指针指向,一张表files_struct这张表有一个核心的部分指针数组fd_array[],里面的每个元素都是一个指向打开文件的指针,通过文件指针来管理内存中的文件。这个数组的下标就称为文件描述符。

 也就是文件描述符fd的本质:是数组下标,通过文件描述符fd就能找到要管理的文件

虽然我们知道了文件描述是什么?但是当我们通过open打开文件,他的文件描述符fd,为什么是3呢?

这要就了解文件描述符是如何分配的。

2、文件描述符的分配规则

linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2,也就是说fd_array[]数组下标从0到2下标都被占用了。那给我新打开的文件操作符分配了fd  = 3,会不会被的文件操作符的分配就是从3开始的呢?

下面我们关闭fd = 0这个下标看看会发生什么?

close(0);//关闭fd = 0,进行观察

 这时发现打印fd = 0。

继续关闭fd = 1,会发现什么?

close(1);//关闭fd = 1,进行观察

 这里发现当我们执行程序后,屏幕中并没有打印出fd的值。

难道程序出现了bug?下面我们继续关闭fd = 2的接口,其他都不变。

close(2);//关闭fd = 2,进行观察

 这时发现,fd = 2被打印出来了,也就是说没有出现bug,那么为什么三次会出现不同的现象呢?

现象汇总

关闭fd = 0

屏幕上打印出fd = 0

关闭fd = 1

屏幕上并没有打印出fd

关闭fd = 2

屏幕中打印出fd = 2

为什么会这样呢?

其实文件描述符fd的分配规则:是从小到大 ,遵循寻找最小而且没有被占用的的fd分配

这也就是为什么我们关闭了fd = 0和fd =2,会打印出fd = 0,fd =  2;因为关闭后就没有被占用了自然就可以被操作系统分配。

至于为什么关闭fd = 1会出现,显示器不打印的情况,因为fd = 1最初的指向是指向控制显示器输出的文件,我们关闭了fd =1,操作系统就不能找到显示器输出文件,所以就无法正常打印,但是实际上fd 就是被分配到了fd = 1这个数组下标里。

二、重定向

1、认识重定向

我们还是要聊一聊上面的代码,当我们关闭了1,是指的是将fd = 1里面的指针不在指向显示器了,而指向了我们的文件,也就是向我们的文件打印的。

但是我们又观察到,这里的add.txt中什么也没有啊,不是说向文件中打印内容吗?其实这是和缓存区有关(这个问题,下次在聊),这里只要我们重新刷新缓存区就可以了。

 这里通过C语言的接口函数fflush强制进行刷新。

 这时候add.txt文件中果然被写入fd。

对应上面这种现象我们就称为重定向,我们将本来fd = 1处的指针本应该指向显示器的重定向的指向了我们自己的文件。

重定向的本质是指向:上层的使用的fd不变,在内核中更改fd对应的struct file*的地址

但是这样重定向会不会太麻烦,每次都要进行关闭fd,其实操作系统为我们提供了专门的重定向的接口。

2、重定向的接口函数dup2

通过重定向的接口dup2,我们就可以很方便进行重定向的工作。

函数原型:

      int dup2(int oldfd, int newfd);

 

 虽然dup接口有三种类型,但是我们最为常用的还是dup2。

函数的参数

上面红框中的部分大意说的是 :newfd是oldfd的应该副本,如果有必要请关闭newfd,也就是最初我们关闭fd =1,这样在去调用重定向。下面是他的注意事项:

  • 如果 oldfd 不是有效的文件描述符,则调用将失败,并且 newfd 不会关闭。 
  • 如果 oldfd 是一个有效的文件描述符,并且 newfd 的值与 oldfd 相同,那么 dup2()可以 什么都没有,并返回 newFD。

oldfd: 指的是我们文件的fd

newfd: 指的是要重定向到那个fd中的fd

这个参数的命名,可能会引起大家的误会,下面我们在代码中去理解。

#define  _CRT_SECURE_NO_WARNINGS#include#include#include#includeint main(){int fd = open("add.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd < 0){perror("open");return 1;}    dup2(fd,1);//重定向fprintf(stdout, "open fd: %d\n", fd);close(fd);return 0;}

 当我们运行程序,就向add.txt中写入了内容。

3、二种重定向 

下面为大家介绍二种常见的重定向:输入重定向(<)和输出重定向(>)。

输入重定向(<)

 对于他的理解我们完全可以从字面意思上理解,指的是重新指定设备来代替键盘作为新的输入设备。

命令符格式:命令 < 文件

下面我们在代码中进一步理解:

int main(){int fd = open("add.txt", O_RDONLY);if (fd < 0){perror("open");return 1;}dup2(fd, 0);//重定向char line[64];while (1){printf("<");if (fgets(line, sizeof(line), stdin) == NULL)break;printf("%s", line);}return 0;}

这是我们提前向add.txt中写的内容 ,下面运行程序

这里我们就将add.txt中的内容,从文件中直接按行读取了,不在需要在键盘中读取了,也就是输入重定向。

这里也就是类似于:

cat < add.txt

 输出重定向(>)

字面意思理解:指的是重新指定设备来代替显示器作为新的输出设备

命令符格式:命令 >文件

这里我们用输出重定向 ,其实就是将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据

来源地址:https://blog.csdn.net/qq_61552595/article/details/128240830

--结束END--

本文标题: [Linux打怪升级之路]-重定向

本文链接: https://lsjlt.com/news/392232.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • [Linux打怪升级之路]-重定向
    前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。  目录 一、文件描述符 1、初识文件描述符  2、文件描...
    99+
    2023-09-03
    开发语言 linux 运维 服务器
  • [Linux打怪升级之路]-环境变量
    前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、认识环境变量 二、获取环境变...
    99+
    2023-09-01
    linux 运维 服务器
  • [Linux打怪升级之路]-文件操作
    前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、认识操纵系统下的文件 1、什...
    99+
    2023-08-31
    linux 运维 服务器
  • linux操作之重定向问题
    目录一、概述二、输出重定向三、输入重定向1、命令解析2、实例解析四、深入理解重定向1、简介2、命令详解五、Here Document1、语法2、实例解析总结linux中的重定向也就是Shell中学习到的输入/输出重定向,...
    99+
    2023-04-26
    linux操作 linux重定向 linux重定向问题
  • Linux 重定向高级教程:如何利用 ASP 实现动态重定向?
    在 Linux 中,重定向是一个非常有用的功能,可以将命令的输出重定向到文件或其他命令中。但是,有时候我们需要更高级的重定向功能,比如动态重定向,这时候我们就需要借助 ASP。 ASP(Active Server Pages)是一种动态网...
    99+
    2023-10-28
    教程 linux 重定向
  • Windows和Linux之间的PHP重定向技巧!
    在Web开发中,重定向是一个非常重要的概念。它允许我们将用户从一个URL转移到另一个URL。在PHP中,我们可以使用header()函数来实现重定向。但是,在Windows和Linux之间,有一些细微的差异,特别是在处理路径时。因此,在本...
    99+
    2023-08-23
    linux 重定向 windows
  • ASP 重定向和打包有哪些相似之处?
    ASP 重定向和打包是两个在 Web 开发过程中非常常见的概念,它们虽然看起来毫不相干,但是实际上它们有不少相似之处。在本文中,我们将会探讨 ASP 重定向和打包的相似之处,并且会用一些演示代码来加深理解。 首先,我们先来看一下 ASP 重...
    99+
    2023-08-20
    重定向 同步 打包
  • PHP打包函数:重定向实现的不二之选
    在Web开发中,重定向是一个非常常见的操作。当我们需要将用户从当前页面跳转到另一个页面时,我们可以通过重定向来实现。在PHP中,有多种方式可以实现重定向,例如使用header函数、使用JS脚本等等。而在这些方式中,使用打包函数实现重定向是...
    99+
    2023-09-13
    打包 函数 重定向
  • PHP如何在Linux和Windows之间进行重定向?
    在Web开发中,重定向是一个常见的操作,可以将用户从当前页面重定向到另一个页面。在PHP中,可以使用header()函数来实现重定向操作。但是,在不同的操作系统中,使用header()函数来进行重定向可能会存在差异。本文将介绍如何在Lin...
    99+
    2023-08-23
    linux 重定向 windows
  • 【Linux学习】之将输出重定向到文件或程序
    将输出重定向到文件或程序 文章目录 将输出重定向到文件或程序1. 标准输入、标准输出和标准错误2. 输出重定向操作符2.1 用法及说明2.2 合并重定向运算符2.3 输出重定向示例2.4 输出...
    99+
    2023-08-31
    linux 学习 服务器 bash 运维
  • Linux的重定向技术再升级:Python和大数据的加持让数据处理更加高效
    在现代社会,数据处理已经成为了各个领域中不可或缺的一环。而在数据处理的过程中,Linux系统的重定向技术一直以来都扮演着至关重要的角色。在过去,我们可以通过简单的管道符号将一个命令的输出作为另一个命令的输入,从而实现数据的传递和处理。但是...
    99+
    2023-09-16
    大数据 重定向 linux
  • 重定向和存储:如何在PHP和Linux之间进行平衡?
    在PHP和Linux之间进行平衡是一个常见的问题,特别是在处理文件上传和下载、日志记录等任务时。本文将介绍如何使用重定向和存储来平衡PHP和Linux之间的负载,并提供一些演示代码来帮助你更好地理解。 什么是重定向? 重定向是一种将请求从...
    99+
    2023-10-06
    linux 重定向 存储
  • ASP 教程:如何利用 Linux 中的重定向提升网站用户体验?
    在建设网站过程中,我们需要考虑很多因素,比如网站的响应速度、用户体验等。其中用户体验是非常重要的一点,因为好的用户体验可以让用户更愿意留在网站上浏览更多内容。在本文中,我们将介绍如何利用 Linux 中的重定向来提升网站的用户体验。 什么...
    99+
    2023-10-28
    教程 linux 重定向
  • 升级Linux生产服务器之前要记住的重要步骤有哪些
    这期内容当中小编将会给大家带来有关升级Linux生产服务器之前要记住的重要步骤有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。服务器安全是每个系统管理员的头等大事。除了拥有第三方安全工具(如防火墙,D...
    99+
    2023-06-28
  • 升级Linux生产服务器之前要记住的重要步骤是怎么样的
    今天就跟大家聊聊有关升级Linux生产服务器之前要记住的重要步骤是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务器安全是每个系统管理员的头等大事。除了拥有第三方安全工具(...
    99+
    2023-06-15
  • 从重定向数组开始,掌握Java在Linux系统中的高级编程技巧
    Java作为一种跨平台的编程语言,在Linux系统中也有广泛的应用。在实际开发中,掌握一些高级编程技巧可以提高代码的效率和可读性。本文将从重定向数组开始,介绍一些Java在Linux系统中的高级编程技巧。 一、重定向数组 在Linux系统中...
    99+
    2023-10-23
    linux 重定向 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作