c-* nix select和exceptfds / errorfds语义
select syscall需要3个filedescriptor集,用于监视fds的可读/可写性以及filedescriptor上的“ exceptions”。
我的选择手册页对exceptfd
描述符集的描述不多。 它是干什么用的; 可以并且会在文件描述符上通知什么样的异常?
我假设这对于描述符类型可以是不同的……无论是TCP套接字,管道,tty等)。 没有人能提供有关select
可以报告各种描述符的错误的更多信息吗?
有时认为,除了错误检测外,还需要exceptfds,但这是一种误解。 错误将在readfds中标记。 尽管POSIX需要它(甚至调用参数errorfds),但是否在OS中也标记了错误取决于OS。 确实,仅当您关心异常情况时才需要此参数,但很少需要检测到这些情况。
符合特殊条件的条件取决于文件描述符的类型,但是到目前为止,最常见的用法是在TCP套接字上,该套接字表示可以使用带有select()
标志的/sys
读取带外数据。 但是,TCP带外数据有许多怪癖(例如,只有1个字节可以处理),因此很少使用。
在最近的Linux内核中,exceptfds可用于检测某些sysfs属性何时更改。 可以通过读取/sys
下的相应文件来读取属性的当前值,并且当属性更改时,文件描述符上的select()
将标记exceptfd。 但是,这当前仅适用于某些属性和安装更改(/proc/mounts
)。
另外,某些设备驱动程序将使用exceptfds标记某些特定于设备的条件。
没错,这取决于您使用文件描述符引用的设备的类型。 因此,套接字,FIFO,串行端口等是不同的...
查看手册页中的read()。 在底部(至少在OS X中),它列出了不同设备可能出现的不同错误。 write()也是如此。
对于套接字,FIFO和其他IPC机制,我将检查Unix网络编程,第1卷和第2卷。IIRC描述了在不同的错误情况下期望什么样的错误。
我曾经用FIFO走过这条路。 我最终集思广益,探讨了生产者和消费者与FIFO两端进行交互的所有方式,然后针对每种情况编写了测试用例。 这是发现所有不同错误情况的一种好方法(尽管很乏味)。 尽管我学到了很多东西,但最终代码现在才可以使用。