相关疑难解决方法(0)

如何检测有人在Linux中打开pty(伪终端)的从属端?

从串行设备(/ dev/ttyXX)读取多个进程使得两个进程都无法获取所有数据 - 数据将以某种方式在它们之间进行分割.我想编写一个从串行设备读取的程序,创建几个主/从pty对,然后允许从串行设备读取的程序从ptys读取,以便所有读取进程接收数据从串行设备开始,让ptys就像串行设备一样,当他们从pty开始读取时,他们只得到最新的数据.换句话说,在开始阅读之前你不会得到任何数据(这是我的经验,这就是/ dev/ttyXX设备的工作方式,或者至少是我正在阅读的RS-232风速计).命名管道可以通过捕获SIGPIPE来模仿这些语义,以确定没有读取器,因此我们可以选择不写入该特定命名管道.但是,在与命名管道通信时,写入使用终端的某些二进制文件可能会失败,因为对isatty()的检查和对tcsetattr()等调用的错误条件可能会导致失败的情况.这里的关键是能够使用为终端编写的现有二进制文件.

因此,如果我能够检测到pty的slave端何时被打开以进行读取,那么这应该给出与命名管道情况中没有SIGPIPE大致​​相同的语义.我注意到HP-UX将TIOCTRAP作为ioctl()命令,它似乎完全符合我的要求,但遗憾的是它在Linux上不可用.

我已经阅读了几天的参考文献,这种类型的东西的选项数量是惊人的.答案可能在于终端设置,阻塞/非阻塞行为,在某处设置缓冲区大小,从poll()/ select()报告的条件,或某些组合.但我似乎找不到任何东西.我想知道是否有可能我需要编写自己的设备驱动程序,但似乎我应该能够做到这一点而不用那么远.

所以,为了澄清:
- 问题是:如何检测有人在Linux中打开pty(伪终端)的从属端?
- 我希望读者打开pty的slave端接收读取器打开pty后严格写入的数据(如果我的多次写入过程只是在读取器打开从属端之前写入数据一段时间,数据将缓冲并且最终编写器将阻塞,并且从属读取器在打开时将立即获得所有缓冲数据 - 这是不可取的,因为我希望它只获得在紧邻时间附近生成的数据)
- 它必须是一个pty,而不是命名管道,套接字等,因为isatty()和tcsetattr()等需要正常,以便现有的二进制文件工作

linux file file-descriptor pty

10
推荐指数
1
解决办法
2942
查看次数

无法在pty/N上更改终端大小(适用于ttyN)

我使用下一个更改终端大小:
rc = ioctl(fd, TIOCSWINSZ, &ws);
当我在linux文本终端下运行(通过Alt-Ctrl-F1切换)时,结果是我希望看到的.整个我的输入和输出在ioctl系统调用给出的范围内.
但是当我通过SSH连接到localhost并运行相同的程序时,它只能部分工作.我的意思是我不能输入比ioctl设置的终端大小更宽的命令,但是输出可以跨越ioctl给出的终端的边界,输入可以占用ioctl设置的更多行.此外没有自动回车和新线.
我直接运行程序时看到的唯一区别是它在终端/ dev/ttyN上运行,它的主要数字是5,当我通过SSH运行程序时,它使用/ dev/pts/N作为终端,主要编号为136所以,据我所知,这是由于终端的不同而发生的.
我的问题:
1.这是正确的吗?终端司机的原因是什么?
2.我该如何解决?我需要通过SSH在本地tty终端中使用相同的行为.

谢谢!

terminal ioctl tty pty

3
推荐指数
1
解决办法
1705
查看次数

标签 统计

pty ×2

file ×1

file-descriptor ×1

ioctl ×1

linux ×1

terminal ×1

tty ×1