* nix select和exceptfds / errorfds语义

select系统调用需要3个文件描述符集,用于监视可读/可写的fds和filedescriptor上的“exception”。

我的select手册页没有提到exceptfd描述符集。 它是干什么用的; 什么样的exception可以和将通知文件描述符?

我假设这可以是不同的描述符types…无论是TCP套接字,pipe道,tty等)。 有没有人有更多的信息,哪些types的错误select可以报​​告不同types的描述符?

有时候认为除了需要检测错误外,还有一个误区。 错误将在readfds中标记。 虽然POSIX需要它(甚至调用参数errorfds ),但是它依赖于操作系统是否也标记了除了fds之外的错误。 真的,这个参数只有在你关心特殊情况时才需要,但是很less有人需要检测这些参数。

什么样的条件取决于文件描述符的types,但是最常见的用途是在TCP套接字上,它表明使用带有MSG_OOB标志的recv()可以读取带外数据。 然而,TCP带外数据有许多怪癖(例如,只有1个字节可能是未知的),因此很less使用。

在最近的Linux内核中, 除了可以用来检测某些sysfs属性更改的情况外。 可以通过读取/sys下的相应文件来读取属性的当前值,并且当属性改变时,文件描述符上的select()将会标记除了fds 。 然而,这目前只适用于某些属性,并且对于挂载更改( /proc/mounts )。

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

你是对的,这取决于你使用文件描述符引用的设备的types。 所以,对于套接字,FIFO,串口等是不同的。

看一下read()的手册页。 在底部(至less在OS X中),它列出了不同的设备可以获得的错误。 write()也一样。

对于套接字,FIFO和其他IPC机制,我将检查出Unixnetworking编程,第1卷和第2卷。IIRC描述了对于不同错误条件期望的错误types。

我用FIFOs走过这条路。 我最终集思广益,制造商和消费者可以与FIFO的每一端进行交互,然后为每种情况编写testing用例。 发现所有不同的错误条件是一种很好的(虽然很乏味)的方法。 我学到了很多东西,最终代码现在才起作用。