Linux重定向:深入理解与实践

这篇具有很好参考价值的文章主要介绍了Linux重定向:深入理解与实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

 文章来源地址https://www.toymoban.com/news/detail-811998.html

                                                           🎬慕斯主页修仙—别有洞天 

                                                         ♈️今日夜电波:晴る—ヨルシカ

                                                                0:20━━━━━━️💟──────── 4:30
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


 

目录

引入

文件描述符的分配规则

重定向理解

什么是重定向?

输出重定向

输入重定向

追加重定向

dup2

重新理解‘输入’和‘输出’重定向

完整的重定向格式

标准输出重定向

标准错误重定向

标准输出以及标准错误重定向同一文件


引入

文件描述符的分配规则

        在Linux系统中,文件描述符是一个数字,这个数字是用于表示打开的文件、管道和网络连接等进程所操作对象的标识符。文件描述符的分配规则遵循最小分配原则,也就是寻找未被占用的最小的文件描述符来使用。

        在Linux进程中,默认会有三个已经打开的文件描述符,对应的是标准输入(0)、标准输出(1)和标准错误(2)。这三个文件描述符分别对应键盘、显示器和打印机等物理设备。

        当我们需要打开新的文件时,系统会根据最小分配原则找到下一个可用的文件描述符进行分配。一般来说,新打开的文件会占用文件描述符3(如果0、1、2尚未被占用),接着是文件描述符4,以此类推。特别的,如果0、1或2已被关闭,那么新打开的文件的文件描述符可能会被赋值为0或1或2。

        需要注意的是,虽然文件描述符是连续分配且依次增大的,但它们的起始值并不从0开始,而是从3开始。

        🌰

        在学习完Linux下的系统文件操作后,我们都知道Linux下一切皆文件,我们可以对文件进行打开、读、写、关闭等操作。而系统默认会帮我们打开三个文件,分别为标准输入、标准输出和标准出错处理,即:stdin、stdout、stderr。这三个文件分别对应文件描述符0、1、2。那么如果我们关闭了其中的一个文件,再额外打开个新的文件会这么样呢?如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FI "fi.txt"
int main()
{
	umask(0);
    close(1);//关闭输出流
    int fd = open(FI, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    printf("hello!\n");
    printf("hello!\n");
    printf("hello!\n");
    printf("hello!\n");
    printf("hello!\n");
    printf("hello!\n");
    printf("hello!\n");
    printf("my fd is %d\n",fd); 
    return 0;
}

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

        对上述代码的情况可见:我们关闭了输出流的文件,新打开了一个文件,而使用printf进行打印操作。需要注意的是:printf、scanf都是默认的输入输出流,也就是说他们是按照stdin、stdout来进行对应的操作的。而此时printf非但没有把字符打印到显示器上反而打印到了新开的那个文件里,并且对应的文件描述符居然是1!这就说明了新开文件的文件描述符是遵守有空就补、从小到大使用的规律。

        大致的操作如下:

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

        对此,这也引出了我们重定向的概念—重定向是一种改变标准输入或输出默认执行方式的操作,无需大量的鼠标和键盘操作就可以完成数据的转移。

重定向理解

什么是重定向?

        在Linux系统中,重定向的本质是修改原来默认的执行方式,对系统命令的执行过程进行重新定义。它主要涉及两个方面:输入重定向和输出重定向。

  • 输入重定向:指的是将一个文件的内容导入到命令中作为输入数据。这种方式可以使得命令的执行不再依赖键盘的输入,而是读取来自指定文件的数据,从而提高了效率和便捷性。
  • 输出重定向:指的是将命令的执行结果保存到文件中,而不是直接显示在显示器上。这种方式可以将命令的输出信息保存下来,以供后续分析和使用,避免了信息的丢失。

        说大白话就是:修改特性文件fd下标的内容,上层fd不变,底层fd指向的内容在改变

输出重定向

        我们通过关闭文件描述符1或者2,然后打开一个新的文件使得通过printf输出的内容输出到fi.txt文件中。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FI "fi.txt"
int main()
{
	umask(0);
    close(1);//关闭输出流
    int fd = open(FI, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    printf("output redirection!\n");
    printf("output redirection!\n");
    printf("output redirection!\n");
    printf("my fd is %d\n",fd); 
    return 0;
}

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

输入重定向

        我们通过关闭文件描述符0,然后打开一个新的文件通过scanf从fi.txt中输入内容,然后再通过printf输出到显示器上。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FI "fi.txt"
int main()
{
	umask(0);
    close(1);//关闭输入流
    int fd = open(FI, O_RDONLY , 0666);
	char *st;
    scanf("%s",st);
    printf("%s\n",st);
    scanf("%s",st);
    printf("%s\n",st);
    scanf("%s",st);
    printf("%s\n",st);
    printf("my fd is %d\n",fd); 
    return 0;
}

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

追加重定向

        本质还是和输出重定向一样关闭文件描述符1或者2,但是需要注意的是我们更改了打开文件的操作,把清空操作改为了追加操作。 O_TRUNC -> O_APPEND

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FI "fi.txt"
int main()
{
	umask(0);
    close(1);//关闭输出流
    int fd = open(FI, O_WRONLY | O_CREAT | O_APPEND,  0666);
    printf("append redirection!\n");
    printf("append redirection!\n");   
    printf("append redirection!\n");
    printf("my fd is %d\n",fd); 
    return 0;
}

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

dup2

        dup2函数是Unix/Linux系统中的一个系统调用函数,作用是复制文件描述符,并将其指定为新的文件描述符。其具体功能是将一个已存在的文件描述符复制到另一个新的文件描述符上,并且可以自定义新文件描述符的编号。系统中的手册如下:

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

        这个函数在C语言中常用于实现输入输出重定向。例如,可以先使用open()函数打开需要重定向的文件,然后使用dup2()函数将指定的文件描述符复制到新的文件描述符。这样就可以改变一个进程的标准输入、标准输出和标准错误输出的文件描述符指向,进而实现重定向的功能。

        dup2函数的原型为 int dup2 (int oldfd, int newfd); 其中,oldfd参数表示要被复制的文件描述符,newfd参数表示新的文件描述符。如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。

        需要注意的是:dup2函数是dup()函数的“升级版“,因为与dup()只能复制一次不同,dup2可以无限次复制文件描述符。此外,如果复制成功,dup2函数会返回最小的尚未被使用过的文件描述符。

 

        🌰

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define FI "fi.txt"
int main()
{
	umask(0);
    int fd = open(FI, O_WRONLY | O_CREAT | O_APPEND,  0666);
    dup2(fd,1);
    printf("append redirection!\n");
    printf("append redirection!\n");   
    printf("append redirection!\n");
    printf("my fd is %d\n",fd); 
    close(fd);
    return 0;
}

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

重新理解‘输入’和‘输出’重定向

        在Linux中,>、>>和<、<<是重定向操作符,用于将命令的输出或输入重定向到文件或管道。

        - >:将命令的标准输出重定向到一个文件中,如果该文件不存在则创建它,如果存在则覆盖原有内容。例如:ls > file.txt 会将ls命令的输出保存到file.txt文件中。

        - >>:将命令的标准输出追加到一个文件中,如果该文件不存在则创建它。例如:ls >> file.txt 会将ls命令的输出追加到file.txt文件中。

        - <:将一个文件的内容作为命令的标准输入。例如:sort < file.txt 会将file.txt文件的内容作为sort命令的输入。

        - <<:将多行文本作为命令的标准输入。例如:echo -e "line1 line2 line3" | cat << EOF 会将EOF标记之间的文本作为cat命令的输入。

        通过上面我们对于重定向的理解,我们也从本质上理解了重定向实际上做的是什么操作,即:修改底层fd的指向。接下来我们进一步学习对于输入和输出的重定向!

完整的重定向格式

        实际上,完整的重定向格式如下:

命令 fd>/>>/</<< 命令

        🌰

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

标准输出重定向

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

标准错误重定向

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

标准输出以及标准错误重定向同一文件

Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

 


                         感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       Linux重定向:深入理解与实践,Linux练功 初阶功法,linux,运维,服务器

                                                                        给个三连再走嘛~  

 

到了这里,关于Linux重定向:深入理解与实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 Linux 内核

    Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核(二) Linux 设备驱动程序 Linux设备驱动开发详解   本文主要用来摘录《深入理解 Linux 内核》一书中学习知识点,本书基于 Linux 2.6.11 版本,源代码摘录基于 Linux 2.6.34 ,两者之间可能有些出入。   可参考 ⇒ 1、

    2023年04月27日
    浏览(67)
  • Linux 内核深入理解 - 绪论

    目录 多用户系统 进程 内核体系架构 文件系统概述 Base 硬链接和软链接 Unix文件类型 文件描述符与索引节点 文件操作的系统调用 Unix内核简述 进程的实现 可重入内核 进程地址空间 同步和临界区 信号与进程之间的通信 进程管理 内存管理 虚拟内存 随机访问存储器的使用 内

    2024年04月28日
    浏览(33)
  • 【Linux】深入理解文件操作

    初次谈论文件 开始之前先谈论一下关于文件的一些共识性问题。 一个文件可以分为两部分,内容和属性。 基于上面的认识,空文件也要在磁盘中占据空间,因为空文件的内容为空,但是还有属性在,例如文件的创建时间… 而这部分属性也是要存储的。 所以对文件的操作就

    2024年02月11日
    浏览(44)
  • 深入理解Linux文件系统

                                                                🎬慕斯主页 : 修仙—别有洞天                                                            ♈️ 今日夜电波: 晴る—ヨルシカ                                    

    2024年01月19日
    浏览(40)
  • 【Linux】深入理解文件系统

    收录于【Linux】文件系统 专栏 关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。 可以到 浅谈文件原理与操作 了解文件操作的系统接口。 想深入理解文件缓冲区还可以看看文件缓冲区 。 目录 系列文章 磁盘 结构介绍 定位数据 抽象管理 文件系

    2024年02月10日
    浏览(43)
  • 【Linux】深入理解进程概念

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:Linux仓库 个人专栏:Linux专栏 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 本篇文章继上一篇的冯诺依曼体系结构和操作系统这两个软硬件的概念之后,开始讲解Linux下 三座大山 之一的 进程 。 因为进程概念虽然不是

    2024年02月14日
    浏览(40)
  • 深入理解Linux内核--内存寻址

    使用80x86微处理器时,需区分三种不同地址。 1.逻辑地址,每一个逻辑地址都由一个段和偏移量组成。 2.线性地址(虚拟地址),如果是32位系统,则位一个32位无符号整数。可表达高达4GB地址。 3.物理地址,用于内存芯片级内存单元寻址。与从微处理器的地址引脚发到内存总

    2024年02月13日
    浏览(45)
  • 深入理解Linux 内核追踪机制

    Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。   Probe Handler 如果我们想要追踪内核的一

    2024年02月15日
    浏览(72)
  • 【Linux】深入理解缓冲区

    目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里  手动设计一个用户层缓冲区 缓冲区本质上一块内存区域,用来保存临时数据。 缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。 这块内存区域是由 谁提供的

    2024年02月15日
    浏览(64)
  • 深入理解Linux虚拟内存管理

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理解Linux虚拟内存管理(四) 深入理解Linux虚拟内存管理(五) 深入理解Linux虚拟内存

    2024年02月06日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包