ZBLOG

如果没有pts/20如何open的时候创建

在 Linux 中,/dev/pts/* 是动态创建的伪终端(Pseudo-Terminal Slave),通常由 终端模拟器(如 sshxterm)或 主设备 /dev/ptmx 自动生成。如果 /dev/pts/20 不存在,直接打开它会失败。以下是 主动创建并控制伪终端对(PTY) 的完整方法:


1. 使用 posix_openpt() + grantpt() + unlockpt()

这是标准 POSIX 方法,适用于需要程序主动创建 PTY 的场景:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>      // posix_openpt()
#include <unistd.h>     // grantpt(), unlockpt()
#include <errno.h>

int main() {
    // Step 1: 打开主设备(自动分配一个未使用的从设备 /dev/pts/N)
    int master_fd = posix_openpt(O_RDWR | O_NOCTTY);
    if (master_fd == -1) {
        perror("posix_openpt failed");
        return -1;
    }

    // Step 2: 设置从设备的权限(允许当前用户访问)
    if (grantpt(master_fd) == -1) {
        perror("grantpt failed");
        close(master_fd);
        return -1;
    }

    // Step 3: 解锁从设备
    if (unlockpt(master_fd) == -1) {
        perror("unlockpt failed");
        close(master_fd);
        return -1;
    }

    // Step 4: 获取从设备路径(如 /dev/pts/20)
    char *slave_path = ptsname(master_fd);
    if (!slave_path) {
        perror("ptsname failed");
        close(master_fd);
        return -1;
    }
    
    printf("Created PTY pair:\n");
    printf("Master FD = %d\n", master_fd);   // e.g., fd=3
    printf("Slave Path = %s\n", slave_path); // e.g., /dev/pts/20

    // Step 5: (可选)打开从设备验证
#if DEMO_OPEN_SLAVE
    int slave_fd = open(slave_path, O_RDWR | O_NOCTTY);
#endif

// ...后续可通过 master_fd/slave_fd 读写数据...

// Step N: 关闭文件描述符
close(master_fd);
return 0;
}

关键函数说明

函数 作用
posix_openpt() 打开主设备 /dev/ptmx,返回主设备的文件描述符。
grantpt() 修改从设备的权限为当前用户可访问。
unlockpt() 解锁从设备,使其可用。
ptsname() 获取从设备的路径名(如 /dev/pts/20)。

2. Shell中通过工具动态创建

如果不想写代码,可以通过以下工具创建 PTY:

(1) screen / tmux

screen -S test_session   # Ctrl+A D detach后,检查 /dev/pts/*
ls /dev/pts/

(2) socat

# 创建一个PTY对并绑定到shell
socat PTY,link=/tmp/myslave,echo=0 EXEC:'/bin/bash'

生成的伪终端路径会显示在输出中。


3. Python快速实现

import os

# Create PTY pair
master, slave = os.openpty()
print(f"Master FD: {master}, Slave FD: {slave}")
print(f"Slave Path: {os.ttyname(slave)}") # e.g., /dev/pts/5

# Write to master (appears in slave)
os.write(master, b"Hello from master!\n")

4.常见问题解决

(1) posix_openpt failed: Operation not permitted (errno=1)

  • 原因:未以 root运行或内核未启用伪终端支持。
  • 解决
    
    sudo sysctl kernel.pty.max=10000   # (可选)调整最大PTY数量
    

(2) Slave端无响应

  • 检查点
    • Slave端是否有进程监听(如用 cat /dev/pts/N)。
    • Master/Slave的读写方向是否正确。

5.应用场景示例

  • 远程终端控制:类似SSH的实现。
  • 自动化测试:模拟用户输入输出。
  • 日志重定向:将程序的stdout/stderr重定向到PTY。

如果需要进一步扩展功能(如信号处理、非阻塞IO),可以结合 poll()/epoll使用!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=8226

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?