根据其手册页,select()系统调用提供对一个或多个文件描述符的三个不同方面的监控:它们是否准备好读取、准备好写入,或者是否“错误”或“异常情况”(语言不同)已经发生。其中哪一个应该被监控,是通过三个fd_set
参数指定的,分别是readfds
、writefds
和errorfds
。虽然有很多关于正确使用readfds
and的优秀文档和示例writefds
,但我几乎找不到任何有用的东西errorfds
。
无论如何,出于下面讨论的原因,我errorfds
尝试使用,并且确实发现了一些情况,其中select()
我的 runloop 中的调用响应了它的一个文件描述符上的“异常条件”。例如,连接到 PTY 的 TTY,当后者从其主控端关闭时,会引发这种情况。
但现在呢?我知道文件描述符上发生了一些“异常情况”,但是一般来说,我如何才能找出究竟是什么原因造成的呢?光看errno
肯定不会给出答案(那时它总是 0)。是否有一些ioctl
我应该注意的“神奇”?
一些进一步的背景:我的一些程序(主要用 C 编写)通过串行端口与外部硬件通信。为了测试,我还编写了一个简单的服务器,它创建了一个 PTY,它是我的其他程序可以连接到的对应 TTY,就好像它是一个串行端口一样。虽然在基本层面上,所有这些都运行良好,但目前根本没有真正实现对错误或其他异常情况的处理,这有时会导致非常讨厌的行为。这需要改变!
我特别感兴趣的一种异常情况是连接是否已断开。例如,当一个端口消失时,我们会很高兴地注意到,例如,因为用户拔出了一个 USB 到串行适配器。正确处理读取和写入错误似乎可以避免最严重的意外副作用,但我想知道是否还有更多(观察errorfds
,或者可能是其他一些信号)我应该做的事情。不幸的是,UNIX 信号处理是我完全不熟悉的。