基本概念

1. 文件描述符

总览: 当一个程序成功向操作系统请求访问一个打开的文件, 内核会返回一个指向内核中全局文件表(global file table)中的入口点(entry)的文件描述符. 文件表入口点包含如: 文件的inode(硬盘中的位置), 字节偏移量(byte offset), 以及对这个数据流的访问限制(只读, 只写等). 整个过程如下图所示:

  • 文件描述符: 是计算机操作系统中被打开文件的唯一标识. 它用来描述一种数据资源, 以及这个数据资源可以如何被访问到
  • 当一个程序请求打开一个文件或者读取某个数据资源时, 比如 socket, 操作系统的内核通常会做以下几件事:
    • 允许访问
    • 在全局文件表中创建一个入口点
    • 为这个程序提供访问入口点的位置
  • 描述符由唯一非负整数标识, 如 1, 2, 567... 对于每个被打开的文件, 至少有一个文件描述符.

2. stdin stdout stderr

  • 在 *Unix 系统当中, 前三个文件描述符0, 1, 2 默认为 stdin stdout stderr
  • 比如使用终端时, 默认情况下:
    1. stdin 从键盘读取
    2.stdout, stderr 输出至屏幕
  • (stream)的概念: 可以理解为数据的传递和走向. 比如 从键盘输入字符到 stdin, 数据经过 stdin 然后到达某个程序, 被程序处理之后需要展示的数据流向 stdout 或者 stderr(如果有错误产生), 最后屏幕显示相关的 stdin 和 stderr(如果有错误产生).

理解 stdout 和 stderr 的区别:
虽说在使用终端时, 两者都会输出到屏幕, 但是二者是源自不同的文件描述符, 也就是数据流(data stream)不一样.
比如在shell当中使用 ls 命令跟着一个不存在的文件时, 屏幕会显示如下, 这里显示的内容属于 stderr 数据流:jovy@Jovy-element:~$ ls dne.file
ls: 无法访问'dne.file': 没有那个文件或目录

如果我在当前目录下新建一个 test.txt 文件, 在使用 ls 命令, 会得到如下结果: jovy@Jovy-element:~$ touch text.txt
jovy@Jovy-element:~$ ls text.txt
text.txt

这时候屏幕上不会显示错误信息, 因为没有 stderr 的数据流产生, 屏幕输出了默认的 stdout 数据流.

3. 重定向文件描述符

在Linux 当中,>,>>,<,<<是和重定向有关的符号.

针对第一个例子,我们把stderr 重定向到/dev/null 当中, 观察屏幕输出的内容:

 jovy@Jovy-element:~$ ls dne.file 2>/dev/null jovy@Jovy-element:~$ 

发现刚才的错误信息不见了, 这是因为 stderr 信息流被重定向到 Linux 当中的特殊设备"/dev/null"去了.

"/dev/null"的意思是--"go nowhere", 哪儿也不去,就像一个黑洞一样.

再试试把第二个例子当中的标准输出重定向到 capture.txt 文件当中:

 jovy@Jovy-element:~$ ls text.txt 1>capture.txtjovy@Jovy-element:~$ jovy@Jovy-element:~$ cat capture.txt text.txt

发现在执行完ls命令之后,屏幕输出text.txt, 然后使用 cat 命令查看stdout 重定向后的文件, 发现了 "text.txt" . 也就是说成功把stdout的数据流定向到capture.txt这个文件当中. 默认情况下, 1>capture.txt 中的 1 可以被省略, Linux 默认为标准输出重定向 .

好,还是上面的例子, 使用 ls dne.file 尝试显示一个不存在的文件, 但是我们给标准输出 stdout 做重定向到 stdout.txt:

 jovy@Jovy-element:~$ ls dne.file >stdout.txtls: 无法访问'dne.file': 没有那个文件或目录jovy@Jovy-element:~$ cat stdout.txt jovy@Jovy-element:~$ 

发现重定向标准输出后, 屏幕显示的还是错误信息, 查看stdout.txt的信息发现没有任何记录.

因此, 这个例子可以表明 stdout 和 stderr 两个的区别是属于不同的两个数据流.

总结

理解清楚文件描述符的概念,理解Linux内核如何运用文件描述符。在此基础上,认清楚stdin, stdout, stderr 三个数据流的作用,就能理解什么是stdin,stdout,stderr啦。

linux 输出重定向_Linux--文件描述符和stdin,stdout,stderr相关推荐

  1. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

  2. 如何理解Linux shell中的“2>1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))(尼玛>符号竟然不支持搜索,害我搜搜不到,只能搜)

    文章目录 前言 有何妙用 如何理解 总结 前言 有时候我们常看到类似这样的脚本调用: ./test.sh > log.txt 2>&1 这里的2>&1是什么意思?该如 ...

  3. Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)

    一.dup/dup2 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接.系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号 ...

  4. linux 输出重定向_linux学习笔记(实验楼) 实验12 数据流重定向

    一.实验介绍 1.1 实验内容 你可能对重定向这个概念感到些许陌生,但你应该在前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是 ...

  5. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  6. 【Linux系统编程】文件描述符的复制dup()和dup2()

    00. 目录 文章目录 00. 目录 01. 文件描述符复制概述 02. 常用函数 2.1 dup函数 2.2 dup2函数 03. 案例实战 3.1 dup示例 3.2 dup2示例 04. 附录 ...

  7. linux内核中的文件描述符(四)--fd的分配--get_unused_fd

    linux内核中的文件描述符(四)--fd的分配--get_unused_fd Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123( ...

  8. linux内核中的文件描述符(一)--基础知识简介

    linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.cs ...

  9. linux内核中的文件描述符(三)--fd的回收

    linux内核中的文件描述符(三)--fd的回收 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csd ...

最新文章

  1. usaco Home on the Range
  2. CPSR和SPSR(转)
  3. H5移动端网页标签模板
  4. Explore Optimization
  5. 宝塔面板怎么下载php,宝塔面板下怎么安装Mosquitto-php扩展
  6. TCP、UDP套接字的数据传输
  7. SAP License:SAP 中的不平
  8. 商业化产品经理与用户产品经理区别
  9. 谷粒学院前台登录流程
  10. java计算机毕业设计家庭园艺服务平台源码+数据库+lw文档+系统
  11. NLP--(八)聊天机器人(一)
  12. 用计算机算四分位数间距,数据不满足正态分布——如何计算中位数(四分位数间距)...
  13. 流行:时尚健康美女10大标准
  14. 万能乘法速算法大全_小学1—6年级必须掌握的数学速算法,超实用!
  15. 排序函数ROW_NUMBER()
  16. 1089A--Lazyland
  17. MySQL性能优化第二弹!数据库结构的优化,梅花香自苦寒来
  18. 高通Qualcomm处理器的手机或设备进EDL 9008模式的办法
  19. exfat最佳单元大小_如何在 Linux 上将 USB 盘格式化为 exFAT | Linux 中国
  20. iOS状态栏使用总结

热门文章

  1. ❤比较两种模糊特效❤filter: blur(10px)和backdrop-filter: blur(10px)的区别
  2. 测试ATS对某个特定域名下文件处理效果的方法
  3. blender硬表面建模渲染终极教程
  4. c语言实现memcpy
  5. LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化
  6. 联想拯救者Y9000-ubuntu-nvidia-驱动安装
  7. linux valgrind memCheck ---内存检查工具的可视化方法valkyrie
  8. 用Azure VM + Azure Database for MySQL搭建Web服务
  9. linux free命令详解和使用实例(查看内存使用率)
  10. Kali Linux python 安装pip