如何在Linux中检测何时打开pty(伪terminal)的slave端?

从串口设备(/ dev / ttyXX)中读取多个进程会导致两个进程无法获得所有数据 – 数据将以某种方式在这些进程之间进行分配。 我想编写一个从串口设备读取的程序,创build几个主/从pty对,然后允许从串口设备读取的程序代替从ptys读取,以便所有的读取过程接收数据从串行设备,并有ptys行为像串行设备的意义上说,当他们开始阅读从pty他们只得到最新的数据。 换句话说,在开始阅读之前,不会得到任何写入的数据(这是我的经验,这是/ dev / ttyXX设备的工作方式,或者至less是我正在阅读的RS-232风速计)。 命名pipe道可以通过捕获SIGPIPE来模仿这些语义,以确定没有读者,因此我们可以select不写入特定的命名pipe道。 但是,写入使用terminal的某些二进制文件在与命名pipe道交谈时可能会失败,因为检查isatty()以及像tcsetattr()这样的调用的错误条件可能导致失败的条件。 这里的关键是能够使用为terminal写入的现有二进制文件。

所以,如果我可以检测到pty的从属端打开读取,这应该给我大致相同的语义,因为在命名pipe道情况下没有SIGPIPE。 我注意到HP-UX将TIOCTRAP作为一个ioctl()命令,它似乎正是我想要的,但遗憾的是它在Linux上不可用。

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

所以澄清一下:
– 问题是:如何在Linux中检测到有人打开pty(伪terminal)的slave端?
– 我想要一个阅读器打开pty的slave端,在阅读器打开pty之后严格接收写入的数据(如果我的多重写入过程只是在读取器打开slave端之前写入数据一段时间,数据将缓冲并且最终作者将会阻止,开放的奴隶读者将立即得到所有的缓冲数据 – 这是不可取的,因为我希望它只获得在临近时间附近产生的数据)
– 它必须是一个pty,而不是一个命名的pipe道,套接字等,因为isatty()和tcsetattr()等需要确定,以便现有的二进制文件工作

Solutions Collecting From Web of "如何在Linux中检测何时打开pty(伪terminal)的slave端?"

你找不到这个的原因是因为没有专门的文档界面来允许它。 但是,有一个技巧可以让你做到这一点。 打开伪终端主机(在这里假定为文件描述符ptm )后,打开并立即关闭从机侧:

 close(open(ptsname(ptm), O_RDWR | O_NOCTTY)); 

这在tty主设置了HUP标志。 您现在使用poll() (例如,每当数据从您的数据源进入时poll()定期轮询HUP标志:

 struct pollfd pfd = { .fd = ptm, .events = POLLHUP }; poll(&pfd, 1, 10 /* or other small timeout */); if (!(pfd.revents & POLLHUP)) { /* There is now a reader on the slave side */ } 

如果读者消失, POLLHUP将被重新设置。

在你的情况下,你可能甚至不需要记得从一个循环到下一个给定的pty是否有一个阅读器 – 只要在你的数据源的read()上阻塞,那么当数据可用时,同时poll()您的主人ttys并将数据发送到没有POLLHUP设置的任何人。

在slave pty上添加一个inotify监视器并对其进行轮询。 您可以打开一个inotify事件。 然后,您可以轮询inotify文件描述符和主pty文件描述符。 你可以得到一个inotify事件来打开(IN_OPEN)。 当从机打开时,这将打开查询。