c-* nix select和exceptfds / errorfds语义

select syscall需要3个filedescriptor集,用于监视fds的可读/可写性以及filedescriptor上的“ exceptions”。

我的选择手册页对exceptfd描述符集的描述不多。 它是干什么用的; 可以并且会在文件描述符上通知什么样的异常?

我假设这对于描述符类型可以是不同的……无论是TCP套接字,管道,tty等)。 没有人能提供有关select可以报告各种描述符的错误的更多信息吗?

leeeroy asked 2020-08-12T10:26:48Z
2个解决方案
31 votes

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

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

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

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

mark4o answered 2020-08-12T10:27:11Z
3 votes

没错,这取决于您使用文件描述符引用的设备的类型。 因此,套接字,FIFO,串行端口等是不同的...

查看手册页中的read()。 在底部(至少在OS X中),它列出了不同设备可能出现的不同错误。 write()也是如此。

对于套接字,FIFO和其他IPC机制,我将检查Unix网络编程,第1卷和第2卷。IIRC描述了在不同的错误情况下期望什么样的错误。

我曾经用FIFO走过这条路。 我最终集思广益,探讨了生产者和消费者与FIFO两端进行交互的所有方式,然后针对每种情况编写了测试用例。 这是发现所有不同错误情况的一种好方法(尽管很乏味)。 尽管我学到了很多东西,但最终代码现在才可以使用。

Rob Jones answered 2020-08-12T10:27:46Z
translate from https://stackoverflow.com:/questions/1342712/nix-select-and-exceptfds-errorfds-semantics