Pseudo Terminal 写到master 里面的数据默认是回显的

本文介绍了解决PseudoTerminal在使用过程中遇到的主设备无法正常向从设备发送数据的问题。通过调整结构体termios的配置,关闭了ECHO等标志位,成功解决了数据传输的回显问题。

 

今天上午调试蓝牙串口, 需要用到 Pseudo Terminal

 

碰到这位兄弟一样的问题

http://topic.youkuaiyun.com/u/20080110/16/3ca493af-09c5-441d-9a6e-381df51ef240.html

 

int find_pts(char **slave)
{
  int    master;
  extern char  *ptsname();

  /* open master pseudo-tty device and get new slave pseudo-tty */
  if ((master = open("/dev/ptmx", O_RDWR)) > 0) {
    grantpt(master);
    unlockpt(master);
    *slave = ptsname(master);
    return(master);

  }

  return(-1);
}

在主设备这一侧,write/read, 然后在从设备这一侧,read/write

试下来,从设备可以往主设备发东西,可是主设备好像不能往从设备发东西啊?
即从设备这一侧write, 主设备这一侧read, 成功;
主设备这一侧write, 从设备这一侧read, 失败,read不过来,变成主设备自己写进去又自己读出来了,很奇怪.

 

 

找了半天终于找到原因:

PseudoTerminal 写到master 里面的数据默认是回显的, 就像通常的 tty设备,输入命令,它会显示输入的命令.

 

设置 struct termios

termio.c_lflag &= ~(ECHO | ICANON | ISIG);

tcsetattr(master, TCSCANOW, &termio);

 

 

Ok & Done!

 

 

<think>好的,用户遇到了一个错误:'Failed to get a pseudo terminal: No such device',需要解决方案。首先,我需要回忆伪终端(PTY)相关的工作原理和常见问题。伪终端在Unix-like系统中用于实现终端模拟,比如SSH连接或终端模拟器。出现这个错误通常是因为系统无法分配可用的PTY设备。 可能的原因有几个。首先,检查系统的/dev/pts目录是否存在,并且是否挂载了devpts文件系统。因为伪终端设备通常位于这里,如果目录为空或未挂载,就会导致无法创建PTY。用户可能需要挂载devpts,使用命令mount -t devpts devpts /dev/pts。 其次,权限问题。检查/dev/ptmx设备的权限是否正确,通常应该是crw-rw-rw-,属主是root。如果权限不对,需要使用chmod或chown调整。此外,确保用户属于tty组,或者有权限访问这些设备。 然后,考虑内核配置。某些情况下,如果内核编译时未启用CONFIG_UNIX98_PTYS选项,会导致不支持伪终端。需要检查内核配置,确认该选项已启用,必要时重新编译内核或加载模块。 还可能涉及到资源限制,比如系统已经用完了可用的PTY数量。这时候可以通过检查/proc/sys/kernel/pty/max和当前使用的PTY数量,调整最大值来解决问题。 此外,用户可能在使用某些容器或虚拟化环境时遇到这个问题,比如Docker默认情况下可能没有正确的配置。需要确保容器有访问PTY设备的权限,并在运行时添加--privileged或相关参数。 还有可能是第三方软件冲突,比如某些安全软件或系统加固工具限制了PTY的创建。检查SELinux或AppArmor的设置,暂时禁用它们以确定是否是问题根源。 最后,更新系统和相关软件包,确保没有已知的bug导致这个问题。如果所有步骤都无效,可能需要查看系统日志(如dmesg或journalctl)寻找更详细的错误信息,或者考虑系统级别的恢复措施。 需要将这些可能的解决方案逐步列出,并建议用户按照顺序排查,从简单的检查开始,逐步深入。同时,提醒用户在修改系统设置时谨慎操作,特别是在生产环境中,备份重要数据。</think>### 错误分析:'Failed to get a pseudo terminal: No such device' 此错误通常发生在尝试创建伪终端(pseudo-terminal, PTY)时,系统无法分配可用的终端设备。常见原因包括: 1. **未正确挂载 devpts 文件系统** 伪终端设备依赖 `/dev/pts` 目录,需确保已挂载 `devpts`: ```bash mount -t devpts devpts /dev/pts ``` 验证是否存在 `/dev/ptmx` 设备文件,其权限应为 `crw-rw-rw-`[^1]。 2. **内核配置问题** 检查内核是否启用伪终端支持: ```bash grep CONFIG_UNIX98_PTYS /boot/config-$(uname -r) ``` 若输出 `CONFIG_UNIX98_PTYS=y` 表示已启用,否则需重新编译内核或加载模块。 3. **资源耗尽** 查看当前 PTY 数量限制: ```bash cat /proc/sys/kernel/pty/max # 最大数量 ls /dev/pts | wc -l # 已使用数量 ``` 临时调整限制: ```bash echo 65535 > /proc/sys/kernel/pty/max ``` 4. **容器/虚拟化环境限制** 在 Docker 中运行时,需添加权限: ```bash docker run -it --privileged <image> ``` ### 解决方案步骤 1. **基础检查** ```bash ls -l /dev/ptmx # 权限应为 crw-rw-rw- ls /dev/pts # 确认存在终端设备文件 mount | grep devpts # 确认 devpts 已挂载 ``` 2. **重建设备文件(谨慎操作)** ```bash rm -rf /dev/pts/* umount /dev/pts mount -t devpts devpts /dev/pts ``` 3. **系统级修复** 若问题持续,更新内核或使用: ```bash systemctl restart systemd-udevd ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值