select() 带有 const 超时参数?

select() with const timeout parameter?

select(2)系统调用在Unix Network Programming (2003) by Stevens, Fenner and Rudoff的第6.3章中定义如下:

#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset,
        fd_set *exceptset, const struct timeval *timeout);

但是 none 现代 Unix,例如 FreeBSD、OpenBSD、NetBSD,Linux,甚至 POSIX[1] 标准,都这样定义系统调用。不过书中注明是"POSIX specifies the const qualifier"。是书上的错误吗?或者,是因为历史原因?不过,所有系统都将 pselect(2) 定义为具有恒定的超时参数。

http://pubs.opengroup.org/onlinepubs/009695399/functions/pselect.html

本书勘误表页面没有将此列为错误:

http://www.unixnetworkprogramming.com/errata.html

POSIX 定义 select() 的接口 如:

int select(int nfds, fd_set *restrict readfds,
       fd_set *restrict writefds, fd_set *restrict errorfds,
       struct timeval *restrict timeout);

The select() function shall be equivalent to the pselect() function, except as follows:

  • ...
  • Upon successful completion, the select() function may modify the object pointed to by the timeout argument.

pselect 函数接受一个 const struct timespec * restrict timeout 参数(POSIX 定义中的同一页)。

书中引用的 const 限定词是错误的。