Linux 伪终端(pty)

通过《Linux 终端(TTY)》一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端。使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vSphere console 等虚拟化方案,其它情况下使用的都是伪终端。本文将介绍伪终端的基本概念。本文中演示部分使用的环境为 ubuntu 18.04。

伪终端

伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。

Master 端是更接近用户显示器、键盘的一端,slave 端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。Linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入 slave 端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图(此图来自互联网):

我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开 /dev/ptmx 文件创建了一个伪终端的 master 和 slave 对,并让 shell 运行在 slave 端。当用户在终端模拟软件中按下键盘按键时,它产生字节流并写入 master 中,shell 进程便可从 slave 中读取输入;shell 和它的子程序,将输出内容写入 slave 中,由终端模拟软件负责将字符打印到窗口中。

伪终端的使用场景

伪终端大概有三类使用场景:

  • 像 xterm、gnome-terminal 等图形界面的终端模拟软件将键盘和鼠标事件转换为文本输入,并图形化地显示输出内容
  • 远程 shell 应用程序(如 sshd)在客户机上的远程终端和服务器上的伪终端之间中继输入和输出
  • 多路复用器应用,如 screen 和 tmux。它们把输入和输出从一个终端转播到另一个终端,使文本模式的应用程序从实际的终端上脱离

Linux 中为什么要提出伪终端这个概念呢?shell 等命令行程序不可以直接从显示器和键盘读取数据吗?
为了同屏运行多个终端模拟器、并实现远程登录,还真不能让 shell 直接跨过伪终端这一层。在操作系统的一大思想——虚拟化的指导下,为多个终端模拟器、远程用户分配多个虚拟的终端是有必要的。上图中的 shell 使用的 slave 端就是一个虚拟化的终端。Master 端是模拟用户一端的交互。之所以称为虚拟化的终端,是因为它除了转发数据流外,还要有点终端的样子。

伪终端原理

伪终端本质上是运行在用户态的终端模拟器创建的一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。对于伪终端来说,重点是软件仿真终端程序运行在用户空间,这是它与终端的本质区别,请参考下面的示意图:

/dev/ptmx 是一个字符设备文件,当进程打开 /dev/ptmx 文件时,进程会同时获得一个指向 pseudoterminal master(ptm)的文件描述符和一个在 /dev/pts 目录中创建的 pseudoterminal slave(pts) 设备。通过打开 /dev/ptmx 文件获得的每个文件描述符都是一个独立的 ptm,它有自己关联的 pts,ptmx(可以认为内存中有一个 ptmx 对象)在内部会维护该文件描述符和 pts 的对应关系,对这个文件描述符的读写都会被 ptmx 转发到对应的 pts。我们可以通过 lsof 命令查看 ptmx 打开的文件描述符:

$ sudo lsof /dev/ptmx

进程默认的 IO

一般情况下我们通过远程连接的方式执行命令时,进程的标准输入、标准输出和标准错误输出都会绑定到伪终端上,下面是一个简单的 demo 程序:

#include <stdio.h>
#include <unistd.h>
int main()
{
    printf("PID : %d\n", getpid());
    sleep(200);

    printf("\n");
    return 0;
}

把这段代码保存在文件 mydemo.c 中,然后执行下面的命令编译并执行该程序:

$ gcc -Wall mydemo.c -o demo
$ ./demo

demo 程序输出了自己进程的 PID,现在另外开一个终端执行 lsof 命令:

$ lsof -p 17981

可以看到进程的 0u(标准输入)、1u(标准输出)、2u(标准错误输出)都绑定到了伪终端 /dev/pts/0 上。

参考:
Linux TTY/PTS概述
The TTY demystified
伪终端 pts man page
伪终端 pty man page

原文地址:https://www.cnblogs.com/sparkdev/p/11605804.html

时间: 2024-08-29 22:58:29

Linux 伪终端(pty)的相关文章

终端和伪终端的区别

终端和伪终端的区别 名词 终端 伪终端 剖析 物理终端:直接连接在主机上的显示器.键盘鼠标统称.在实际机架式服务器部署中,一般是多台服务器共享一套终端,简称KVM(Keyboard键盘,video显示器,mouse鼠标) 虚拟终端(tty):附加在物理终端之上,用软件方式虚拟实现,CentOS默认启用6个虚拟终端,可以通过快捷键来切换,切换方式:Ctrl-Alt-F[1--6], 对应的文件是/dev/tty#.可以同过tty命令来查看当前的虚拟终端号.tty是teletypewriter的简称

linux的终端,网络虚拟终端,伪终端(转)

转自http://www.xuebuyuan.com/877887.html 2013年09月07日 ⁄ 综合 ⁄ 共 4047字 ⁄ 字号 小 中 大 ⁄ 评论关闭 Linux上许多网络服务应用,如l2tp.pptp.telnet,都用到了伪终端.有朋友在问这方面的概念,把偶知道的写下来,以供讨论. 一.终端要理解伪终端(Pseudo Terminal),先来看看什么是“终端”(Terminal). 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备. 1.串行端口终端

linux的终端,网络虚拟终端,伪终端

linux的终端,网络虚拟终端,伪终端 转自:http://www.xuebuyuan.com/877887.html Linux上许多网络服务应用,如l2tp.pptp.telnet,都用到了伪终端.有朋友在问这方面的概念,把偶知道的写下来,以供讨论. 一.终端要理解伪终端(Pseudo Terminal),先来看看什么是“终端”(Terminal). 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备. 1.串行端口终端(/dev/ttySx)串行端口终端(Seria

Linux终端概念,伪终端,串行终端,虚拟终端,控制台

终端的历史由来 最初的计算机由于价格昂贵,因此,一台计算机一般是由多个人同时使用的.在这种情况下一台计算机需要连接上许多套键盘和显示器来供多个人使用.在以前专门有这种可以连上一台电脑的设备,只有显示器和键盘,还有简单的处理电路,本身不具有处理计算机信息的能力,他是负责连接到一台正常的计算 机上(通常是通过串口),然后登陆计算机,并对该计算机进行操作.当然,那时候的计算机操作系统都是多任务多用户的操作系统.这样一台只有显示器和键盘能够通过串口连接到计算机 的设备就叫做终端. 而控制台又是什么回事呢

[fw]Linux下tty/pty/pts/ptmx详解

基本概念: 1> tty(终端设备的统称):tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适.终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备. 2> pty(虚拟终端):但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty) 3> pts/ptm

Linux的终端类型

终端是一个很重要的外设,用过终端设备的人都知道如果设备类型不对就会有乱字符,也可用仿真终端软件如netterm试验一下,Linux的终端信息放在 /usr/share/terminfo下,在这个目录的子目录v下就有许多的如vt100,vt102,vt200等,你看一下就知道了. 用例:如在ssh终端上先执行:TERM=linux才能用top命令 查看终端模拟的终端类型名,即查看TERM变量:# export | grep TERM declare -x TERM="xterm" 可以通

终端,虚拟终端,伪终端

终端,虚拟终端和伪终端概念之间的区别是: 一.终端 英文为System Console,指的是"键盘和打印机硬件设备组合",或者是"键盘和显示器硬件设备组合",或者是"其他的输入和输出硬件设备组合". System Console的定义跟操作系统和应用软件无关,只跟硬件有关. 二.虚拟终端 英文为Virtual console,指的是在BSD,UnixWare,Linux等操作系统中提供的特性,在该特性中,通过程序来模拟多个Virtual con

Linux中终端和控制台区别

Linux中终端和控制台区别: 终端:英文名叫terminal 控制台:英文名叫console 两者区别要从以前的多人使用的计算机开始 以前,由于计算机很昂贵,所用一台计算机一般由多个人同时使用.这样一台计算机上需要连接很多套键盘和显示器供多个人使用.这种只有显示器和键盘能够通过串口连接到计算机的设备就叫终端. 而在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台. 注意控制台和终端的区别.终端是通过串口连接上的,不是计算机本身就有的设备,而控制台是 计算机本身就有的设备,一个计算机只

apue 第19章 伪终端

伪终端是指对于一个应用程序而言,他看上去像一个终端,但事实上它并不是一个真正的终端. 进程打开伪终端设备,然后fork.子进程建立一个新的会话,打开一个相应的伪终端从设备.复制输入.输出和标准错误文件描述符,调用exec,子进程从设备编程伪终端. 伪终端能像终端一样,但是无意义的函数调用如改变波特率.发送中断符.设置奇偶校验将被忽略. 伪终端可以做输入和输出. posix_opent函数提供了一种可移植的方法来打开下一个可用伪终端主设备 #include <stdlib.h> #include