*nix select和exceptfds/errorfds语义

lee*_*roy 42 c unix select systems-programming

选择系统调用需要3个文件描述符集留意可读/写FDS和"例外"的文件描述符.

我的选择手册页没有exceptfd说明描述符集.它是干什么用的; 什么样的例外可以并且会通知文件描述符?

我假设这可能与描述符类型不同......无论是TCP套接字,管道,tty等等.有没有人有更多信息select可以报​​告哪种错误可以报​​告不同类型的描述符?

mar*_*k4o 32

有时人们认为需要使用exceptfds来检测错误,但这是一种误解.错误将在readfds中标记.虽然POSIX需要它(甚至调用参数errorfds),但它依赖于操作系统是否也在exceptfds中标记错误.实际上,只有在关心异常情况时才需要此参数,但很少需要检测这些参数.

作为一个特殊的条件取决于那种文件描述符,但到目前为止最常见的用途是在TCP套接字它表明了带外数据可使用读什么资格recv()MSG_OOB标志.但是,TCP带外数据有许多怪癖(例如,只有1个字节可能是未完成的),因此很少使用.

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

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


Rob*_*nes 1

你是对的,这取决于你使用文件描述符引用的设备类型。所以,对于套接字、FIFO、串行端口等来说是不同的......

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

对于套接字、FIFO 和其他 IPC 机制,我会查看《Unix 网络编程》第 1 卷和第 2 卷。IIRC 它描述了不同错误条件下会出现什么样的 errnos。

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

  • 虽然有趣,但这并不能回答问题。如果我正确理解你的答案,你所说的是读取时触发的可能错误条件(errno),这与 exceptfds 无关 (4认同)