终端设备 tty,pty,pts 概念与文件描述符的联系
第1节 理解终端设备tty、pty、pts概念
简要描述:
- 终端设备默认具有输入、输出功能。
- 现代我们最常用的接入服务器端的方式(如:ssh通过tcp/ip的方式连接服务器端,作为服务器的终端设备)为服务的接入方式。
- 但服务器端默认的连接终端为tty模式,(是以串口设备的接入方式,如我们的键盘、显示器),服务器默认提供tty1...tty6共6个终端接口,用Ctrl+Alt+F1...F6切换。
- 所以在ssh通过tcp/ip连接服务器端的时候,服务器系统会将该服务转换为ptmx设备形态(可以理解为硬件链路)接入服务器端。
- 同时将该ssh服务fork的子进程转换为pts设备(可以理解为输入输出设备),再用PTY驱动将两个设备绑定起来。
第2节 终端设备与文件描述符fd(file description)及重定向的关系
| 计算机3个组件 | 与文件描述 | 文件描述的数字表示 | 对应文件 |
| 存储器 | 磁盘相关 | 3 ~ 65535 | (终端设备执行)程序所打开磁盘上的文件 |
| 输入设备 | 相关 | 0(符号:<或0<) | /dev/stdin |
| 输出设备 | 相关 | 1(符号:>或1>) | /dev/stdout |
| 错误报告 | 2(符号:2>) | /dev/stderr |
简要描述:
- Linux中一切皆文件,所有的存在都以文件的形式展示出来,文件描述符专用于描述系统调用文件使用情况,为每个打开的文件都打上标识且占用一个文件描述符。
- 终端设备与文件描述符及重定向[ >,< ](注意不是追加重定向)不是单独存在,而是相辅相成。
- 重定向主要的作用是数据源流从一个设备流向另一个设备中。(磁盘上的所有类型文件,在概念上都属于设备文件,因为文件都是保存在磁盘中,对文件的操作,其本质上就是对磁盘操作)。
- 终端设备一般含有计算机的3大部件中的输入设备和输出设备(这与计算机发展历史相关,输入设备可以是键盘或其他能输出数据的设备,输出设备可以是显示器或其他能接收数据的设备)。
- 每个终端设备接入Linux系统,系统为该终端的输入功能绑定为0的文件描述符,输出功能绑定为1的文件描述符,在处理终端设备发送过来的指令出现错误时,错误提示绑定为2的文件描述符。
第3节 终端设备与文件描述符及重定向的默认行为
3.1 终端设备与文件描述符及重定向的默认行为
默认情况下:系统会帮用户默认补全输入及输出的重定向路径。所以一般情况下,手工写上重定向时,就是修改系统默认的输入与输出的路径。
比如:
cat jeson.sh # 等效 cat 0< jeson.sh 1> /dev/pts/0
| 处理方法 | 输入设备负责为处理的方法提供数据源 | 处理完的结果交给输出设备(由输出设备将数据输出) | |||||
| 用户输入 | cat | jeson.sh | |||||
| 系统自动补全 | cat | 0 | < | jeson.sh | 1 | > | /dev/pts/0 |
|
输入设备 可理解cpu获取数据入口 |
数据源设备 | 发送设备
可理解cpu输出数据的出口 |
接收设备 | ||||
磁盘上的所有类型文件,在概念上都属于设备文件,因为文件都是保存在磁盘中,对文件的操作,其本质上就是对磁盘操作。磁盘属于存储设备。
3.2 描述符与重定向;将数据重定向相应的设备中
|
pts/0 将echo输出的数据,定位到/dev/tty1 的输出设备 |
tty1 显示pts/0输入的数据 |
[jeson@mage-jump-01 ~/]# who |
[jeson@mage-jump-01 ~/]# who |
|
pts/0和tty1 终端登录后的PID号 |
|
[jeson@mage-jump-01 ~/]$ps aux|egrep "[p]ts|tty" |
|
|
只要有PID号,/proc就会为其pid建立一个目录,该目录放该pid相关的数据文件 |
|
[jeson@mage-jump-01 ~/]$ls /proc/ | grep -E '[1-9]+' | column |
|
3.3 终端设备接入系统,系统为终端设备设置对应文件描述符的操作方式(0,1,2)
| 系统为每一个接入终端都配备默认的文件描述符 |
[jeson@mage-jump-01 ~/]$ll /dev/std* |
| 系统为pts/0接入终端默认绑定的文件描述符操作 |
[jeson@mage-jump-01 ~/]$ll /proc/self/fd |
| 得出系统设备、特殊文件描述符、终端的链接关系为 |
/dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 |
3.4 打开文件描述符
- 打开文件描述符有程序自动指定和人为手动指定编号两种方式
- 程序在打开文件描述符的时候,有三种可能的行为:从描述符中读、向描述符中写、可读也可写。
- 从lsof的FD列可以看出程序打开这个文件是为了从中读数据,还是向其中写数据,亦或是既读又写。
例如:以下实例就是打开文件从中读、写、读写数据的(3r的r是read,w是write,u是read and write)。
|
窗口1 |
窗口2 |
|
| 程序自动指定编号 | 人为手动指定编号 | |
| 只读模式;命令行执行如下命令 |
[jeson@mage-jump-01 ~/]$lsof -n | grep 'read.txt'|column -t |
|
| tail -f read.txt | exec 3<read.txt | |
| 只写模式;命令行执行如下命令 |
[jeson@mage-jump-01 ~/]$lsof -n | grep 'write.txt'|column -t |
|
| cat > write.txt | exec 3>read.txt | |
| 可读可写模式;命令行执行如下命令 |
[jeson@mage-jump-01 ~/]$lsof -n | grep 'read_write.txt'|column -t |
|
| vim read_write.txt | exec 4<>read.txt | |
3.5 复制、关闭文件描述符
文件描述符的复制(duplicate),文件描述符的复制表示当前操作的文件描述符被(作用或者理解为移动)到另一个文件描述符中。
[n]>&digit- :将文件描述符digit代表的输出文件移动到n上,并关闭digit值的描述符。
[n]<&digit- :将文件描述符digit代表的输入文件移动到n上,并关闭digit值的描述符。
[n]<&- :直接关闭n描述符。
实例 1:
[jeson@mage-jump-01 ~/]$lsof -n | grep "read.txt" | column -t
bash 19492 jeson 3r REG 8,2 0 41054753 /home/jeson/read.txt
[jeson@mage-jump-01 ~/]$exec 4<&3-
[jeson@mage-jump-01 ~/]$lsof -n | grep "read.txt" | column -t
bash 19492 jeson 4r REG 8,2 0 41054753 /home/jeson/read.txt
[jeson@mage-jump-01 ~/]$exec 4<&-
[jeson@mage-jump-01 ~/]$lsof -n | grep "read.txt" | column -t
[jeson@mage-jump-01 ~/]$
可见:fd=3移动到fd=4后,原本与fd=3关联的read.txt已经关闭,并且关联到fd=4上; 最后把fd=4直接关掉了。
实例 2:
[jeson@mage-jump-01 ~/]$echo "I am a boy"
I am a boy
[jeson@mage-jump-01 ~/]$echo "I am a boy" >/dev/null 2>&1
[jeson@mage-jump-01 ~/]$
画图说明:

第4节 文件描述符的高阶使用
案例 1 :
[jeson@mage-jump-01 ~/]$echo "123456" >jeson.sh
[jeson@mage-jump-01 ~/]$exec 5<>jeson.sh
[jeson@mage-jump-01 ~/]$read -n 3 <&5
[jeson@mage-jump-01 ~/]$echo $REPLY
123
[jeson@mage-jump-01 ~/]$echo -n "+" >&5
[jeson@mage-jump-01 ~/]$exec 3>&-
[jeson@mage-jump-01 ~/]$cat jeson.sh
123+56
简要描述:
打开文件 jeson.sh 以read/write方式,并分配fd=5给该文件进程。
这时fd=0已经绑定到fd=5上,而fd=5的重定向目标为jeson.sh,所以fd=0的目标也是jeson.sh,即从jeson.sh中读取数据。这里read命令读取3个字符,由于read命令中没有指定变量,因此分配给默认变量REPLY。注意,这个命令执行结束后,fd=0的重定向目标会变回/dev/stdin。
这时fd=1也已经绑定到fd=5上,而fd=5的重定向目标文件为jeson.sh,所以fd=1的目标也是jeson.sh文件,即数据写入到jeson.sh中。这里写入一个+号。注意,这个命令结束后,fd=1的重定向目标回变回/dev/stdout。
关闭fd=5,这也会关闭其指向的文件jeson.sh,关闭文件操作进程。
案例 2 :
[jeson@mage-jump-01 ~/]$exec 6>&1
[jeson@mage-jump-01 ~/]$exec > jeson.sh
[jeson@mage-jump-01 ~/]$echo "I am a boy"
[jeson@mage-jump-01 ~/]$exec 1>&6-
[jeson@mage-jump-01 ~/]$cat jeson.sh
I am a boy
简要描述:
- 打开文件描述符进程fd=6,并指向1对应的/dev/stdout。
- 打开文件描述符fd=1进程指向jeson.sh文件。
- 输入的数据,定位到描述符fd=1进程,1进程对应jeson.sh文件。
终端设备 tty,pty,pts 概念与文件描述符的联系的更多相关文章
- (从终端看linux-1)linux tty pty pts 概念 区别
基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东 ...
- 18 shell 重定向以及文件描述符
1.对重定向的理解 2.硬件设备和文件描述符 文件描述符到底是什么 3.Linux Shell 输出重定向 4.Linux Shell 输入重定向 5.结合Linux文件描述符谈重定向 6.Shell ...
- 文件描述符与FILE
1. 文件描述符(重点) 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创 ...
- linux终端 tty pty pts等
linux终端 tty pty pts等 20140608 Chenxin整理 系统变量TERM不知是用来干什么的?它的值有vt100,vt220等,这些值代表什么意思? 环境变量TERM设置为终端机 ...
- tty & pty & pts
[tty & pty & pts] 基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过 ...
- (文件描述符0、1、2),(stdin、stdout、stderr),(终端设备)这三者之间的关系???
前言 在Linux系统中,一切设备都看作文件.而每打开一个文件,就有一个代表该打开文件的文件描述符.程序启动时默认打开三个I/O设备文件:标准输入文件stdin,标准输出文件stdout,标准错误输出 ...
- 文件描述符file descriptor与inode的相关知识
每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process ...
- Linux中文件描述符fd和文件指针flip的理解
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- Linux系统学习笔记:文件描述符标志
文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...
随机推荐
- 《算法》第四章部分程序 part 3
▶ 书中第四章部分程序,加上自己补充的代码,随机生成各类有向图 ● 随机生成有向图 package package01; import edu.princeton.cs.algs4.StdOut; i ...
- smbpasswd 和 pdbedit 的区别
以前我们在windows上共享文件的话,只需右击要共享的文件夹然后选择共享相关的选项设置即可.然而如何实现windows和linux的文件共享呢?这就涉及到了samba服务了,这个软件配置起来也不难, ...
- LINUX系统备份还原
1.Linux系统备份工具 REAR (RELAX-AND-RECOVER) https://blog.csdn.net/qq43748322/article/details/78710754?loc ...
- 天天向上的力量 III(python在pycharm实现)
'''描述一年365天,以第1天的能力值为基数,记为1.0.当好好学习时,能力值相比前一天提高N‰:当没有学习时,能力值相比前一天下降N‰.每天努力或放任,一年下来的能力值相差多少呢?其中,N的取值范 ...
- PHP解决网站大流量与高并发
1:硬件方面 普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的.主要影响服务器的速度 有:网络-硬 ...
- 【转】Jenkins 二次开发 - Python
马克,备用: Jenkins 二次开发 https://testerhome.com/topics/14988?locale=zh-TW python-jenkins api 文档:https://p ...
- (原)Echarts 报Uncaught Error: Initialize failed: invalid dom 根本解决
1.循环出的Echarts出现 Uncaught Error: Initialize failed: invalid dom ,附上完美解决方案 setTimeout(function () { co ...
- Android DevArt2:Android 5.0下 Dialog&AlertDialog 并不会影响Activity的生命周期
先给出结论:Dialog和AlertDialog并不会影响到Activity的生命周期,但会影响到Activity的优先级. 核心代码: onCreated中: Resources resources ...
- sqlalchemy 学习--单表操作
以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ...
- 主流浏览器 Cookie 的大小
目前测试的两种浏览器:Chrome 和 IE . 环境:IIS 7.5 只创建了站点,未做任何配置. Chrome : v36.0.1985.143 m 单个 Cookie 的长度为 4069 个字符 ...

