select系统调用使用3个filedescriptor集来监视fds的可读/可写状态以及filedescriptor上的“exceptions”。

我的选择man page并没有过多说明exceptfd描述符集。这有什么用途;可以并且会在文件描述符上通知什么样的异常?

我假设这对于描述符类型可以是不同的……无论是TCP套接字,管道,tty等)。有谁知道select可以报告各种描述符的错误类型的详细信息吗?

最佳答案

有时认为,除了fdsfds才能检测到错误,但这是一个误解。错误将在readfds中标记。尽管POSIX要求(甚至调用参数errorfds),但是否在OS中也标记了错误取决于OS。实际上,仅当您关心异常情况时才需要此参数,但很少需要检测到这些情况。

符合特殊条件的条件取决于文件描述符的类型,但是到目前为止,最常见的用法是在TCP套接字上,在TCP套接字上,可以使用带recv()标志的MSG_OOB读取带外数据。但是,TCP带外数据有许多怪癖(例如,只有1个字节可以处理),因此很少使用。

在最近的Linux内核中,exceptfds可用于检测某些sysfs属性何时更改。可以通过读取/sys下的相应文件来读取属性的当前值,并且当属性更改时,文件描述符上的select()将标记exceptfds。但是,这当前仅适用于某些属性以及安装更改(/proc/mounts)。

另外,某些设备驱动程序将使用exceptfds标记某些特定于设备的条件。

10-08 11:17