【Linux】输入输出管理

一 输入输出使用到的系统资源

1.1 字符设备(Character Devices)

什么是字符设备

字符设备是 Linux 中的一类设备,支持以字符为单位进行数据传输。与块设备不同,字符设备不需要缓 冲区,即数据是逐字节直接传递的。典型的字符设备包括串口、键盘、鼠标、伪终端等

字符设备的用途与典型应用场景

字符设备的主要用途是与硬件直接交互,比如读取传感器数据或控制某些外设。典型场景包括:

  • 提供用户空间与硬件交互的接口。
  • 模拟设备,用于调试或测试。
  • 创建自定义的和应用层通信的方法。

常见的字符设备文件

终端设备:

bash 复制代码
/dev/tty 							#当前终端。
/dev/tty0、/dev/tty1、/dev/tty2 	   #系统的虚拟控制台

伪终端:

bash 复制代码
/dev/pts/* 							#伪终端设备,用于终端仿真。

1.2 程序的输入输出

程序的输入输出包含的信息有:

bash 复制代码
stdio:  #标准输入,编号为0
stdout: #标准正确输出,编号为1
stderr: #标准错误输出

!NOTE

程序在开启后会在/proc/pid/fd/这个目录中利用系统中的输入输出设备文件在此目录中建立用于处理输入输出字符的设备文件

二 管理系统中的输入输出

2.1 什么是重定向?

将原本要输出到屏幕上的内容,重新输入到其他设备中或文件中

重定向类型包括

  • 输入重定向
  • 输出重定向

2.2 输入重定向

指定设备(通常是文件或命令的执行结果)来代替键盘作为新的输入设备

BASH 复制代码
#单行输入重定向示例
vim test
test
TEST
testfile
TESTFILE

tr 'a-z' 'A-Z' < lee ##把test文件中的内容定向到tr程序中
bash 复制代码
#多行输入重定向示例
tr 'a-z' 'A-Z' <<EOF (字符任意)
test 			#此处的test不能表示为文件名称只表示test字符
test1
EOF 			(当首字母再次出现表示录入结束)

2.3 输出重定向

将原本要输出在屏幕上的结果放到指定的设备(通常是文件)

重定向作用

  • 当屏幕输出的信息很重要,而且希望保存重要的信息备份
  • 不干扰屏幕的使用,例如ping baidu
  • 储存错误/报错日志
  • 定时任务的运行结果
  • 执行一个命令,把报错信息丢弃到/dev/null
  • 执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文 件。

输出重定向类型

类型符号 作用
> 重定向正确输出
2> 重定向错误输出
&> 重定向所有输出

以下的示例要在普通用户上完成,权限不多会报错误

正确输出重定向

复制代码
#重定向正确输出
find /etc -name passwd > test.out	#剩下的错误输出就会输出再屏幕终端上

错误输出重定向

bash 复制代码
#重定向错误输出
find /etc -name passwd 2> test.err	#剩下的正确输出就会输出再屏幕终端上

重定向所有输出

bash 复制代码
#重定向所有输出
find /etc -name passwd &> test.all

!CAUTION

输出重定向会覆盖源文件内容

2.4 追加定向类型

追加定向类型符号 作用
>> 追加正确食输出到文件
2>> 追加错误输出到文件
&>> 追加所有输出到文件
bash 复制代码
find /etc -name passwd >> test.out
find /etc -name passwd 2>> test.err
find /etc -name passwd &>> test.all

!NOTE

追加定向不会覆盖原文件内容

2.5 管道

管道在Linux中是一种特殊的文件类型,它在内存中创建一个缓冲区,用于存储一个命令的输出和另一个 命令的输入。当使用管道连接命令时,前一个命令的标准输出(stdout)会被重定向到管道的写端,而 后一个命令的标准输入(stdin)会被连接到管道的读端

bash 复制代码
#统计/bin 目录中有多少文件
ls /bin/ | wc -l

2>&1

当使用管道时,只有正确输出会被管道处理,错误输出是无法通过管道的,如果想让管道处理错误输 出,需要把错误输出放到正确输出的设备中,2>&1就是用来完成此操作的

bash 复制代码
#统计find命令输出结果的行数
find /etc/ -name passwd 2>&1 | wc -l

tee

当输出通管道后,内容就被管道处理了,如果行看到输出内容需要对输出内容进行复制然后在通过管道 处理

bash 复制代码
find /etc -name passwd 2>&1 | tee test.all | wc -l
相关推荐
chlk12313 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑13 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件14 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒14 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux