Linux ptys是伪终端(Pseudo-Terminal)的缩写,是一种软件模拟的终端设备,用于在没有真实物理终端的情况下,为进程提供类似物理终端的输入输出交互能力。它广泛应用于SSH远程登录、图形界面终端模拟器、容器终端等场景中,是Linux系统终端体系的重要组成部分。

ptys的核心组成
ptys由一对关联的虚拟设备构成,分别是主设备(master side)和从设备(slave side),二者通过内核中的ptys驱动实现数据双向传输:
- 主设备:由控制端程序(如SSH服务端、终端模拟器)持有,负责接收从设备发送的数据,以及向从设备写入需要输出的内容。
- 从设备:表现为一个标准的终端设备(路径通常为/dev/pts/N,N为数字编号),会被分配给需要终端的进程,作为该进程的stdin、stdout、stderr使用。
ptys的工作流程
以用户通过图形界面终端模拟器启动bash进程为例,ptys的工作流程如下:
- 终端模拟器向内核请求创建一个新的ptys对,内核分配主设备fd和对应的从设备节点。
- 终端模拟器通过fork创建子进程,子进程中将从设备设置为标准输入输出,然后exec启动bash进程。
- 用户在终端模拟器输入字符,终端模拟器将字符写入ptys主设备,内核驱动将字符转发到从设备,bash进程从stdin读取到输入内容并处理。
- bash进程的输出(如命令执行结果)写入ptys从设备,内核驱动将内容转发到主设备,终端模拟器从主设备读取内容后显示在界面上。
ptys的常见应用场景
远程登录服务
SSH服务在用户登录时,会为当前会话创建ptys,将远程客户端的输入转发到ptys主设备,同时将ptys从设备的输出返回给客户端,实现远程命令交互。
图形界面终端模拟器
如GNOME Terminal、Konsole等工具,本质都是先创建ptys,再在子进程中启动shell,实现图形界面下的终端交互功能。
容器终端交互
Docker等容器运行时,使用docker exec -it进入容器时,会为容器内的进程分配ptys,实现用户与容器内进程的交互式操作。
ptys相关操作示例
可以通过以下命令查看当前系统已分配的ptys从设备:
# 查看当前所有已分配的ptys从设备 ls -l /dev/pts/ # 输出示例: # total 0 # crw--w---- 1 user tty 136, 0 10月 12 10:00 0 # crw--w---- 1 user tty 136, 1 10月 12 10:05 1
也可以通过简单的代码模拟ptys的创建过程,以下是基于C语言的ptys创建示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <utmp.h>
int main() {
int master_fd;
char slave_name[64];
pid_t pid;
// 创建ptys对,获取主设备fd和从设备名称
int ret = openpty(&master_fd, NULL, slave_name, NULL, NULL);
if (ret == -1) {
perror("openpty failed");
exit(1);
}
printf("创建ptys成功,从设备名称:%sn", slave_name);
pid = fork();
if (pid == 0) {
// 子进程:将从设备设置为标准输入输出
close(master_fd);
setsid();
int slave_fd = open(slave_name, O_RDWR);
dup2(slave_fd, STDIN_FILENO);
dup2(slave_fd, STDOUT_FILENO);
dup2(slave_fd, STDERR_FILENO);
close(slave_fd);
// 执行shell
execl("/bin/bash", "/bin/bash", NULL);
perror("execl failed");
exit(1);
} else if (pid > 0) {
// 父进程:持有主设备,可在此处实现输入输出转发逻辑
close(master_fd);
waitpid(pid, NULL, 0);
} else {
perror("fork failed");
exit(1);
}
return 0;
}
ptys与物理终端的区别
物理终端是真实的硬件设备,直接与系统硬件交互,而ptys是完全由软件模拟的虚拟终端,不依赖物理硬件。二者在进程看来都是标准的tty设备,都支持终端相关的ioctl操作,比如设置终端窗口大小、修改终端模式等,但ptys的生命周期由创建它的进程控制,进程退出后对应的ptys会被内核自动回收。
ptysLinux_terminalpseudo_terminaltty_driver修改时间:2026-06-11 13:06:16