如果多个进程从串行设备(/dev/ttyXX)读取数据,那么这些进程无法获取所有数据 -- 数据将以某种方式在它们之间分配。我想编写一个程序,从串行设备中读取数据,创建多个主/从pty对,然后允许原本为串行设备而编写的程序从ptys读取数据,使得所有读取进程都能接收到来自串行设备的数据,并且在开始从pty读取时,pty会像串行设备一样只提供最新的数据。换句话说,在你开始读取之前不会获取到任何已经写入的数据(根据我的经验,这是/dev/ttyXX设备的工作方式,或者至少是我正在读取的RS-232风速仪的方式)。命名管道可以通过捕获SIGPIPE来模仿这些语义,以确定是否有读取器,因此我们可以选择不向特定的命名管道写入。然而,当使用终端写入二进制文件时,一些检查isatty()和调用tcsetattr()的errno条件可能导致失败。关键在于能够使用已经针对终端编写的现有二进制文件。
所以,如果我可以检测到打开了pty的从端以进行读取,这应该给我与命名管道情况下没有SIGPIPE的大致相同的语义。我注意到HP-UX具有TIOCTRAP作为ioctl()命令,它似乎完全符合我的要求,但可悲的是它在Linux上不可用。
我已经阅读了几天的参考资料,这种类型的选项数量惊人。答案可能在终端设置、阻塞/非阻塞行为、在某个地方设置缓冲区大小、来自poll()/select()的条件报告或某些组合中。尽管如此,我似乎找不到任何线索。我想知道是否有可能需要编写自己的设备驱动程序,但是这似乎不必要。
因此,为了澄清:
- 问题是:如何检测Linux中的pty(伪终端)的从端何时被打开?
它必须是一个pty,而不是命名管道、套接字等,因为isatty()和tcsetattr()需要正常工作,以便现有的二进制文件可以工作。