select()与const超时参数?

时间:2015-04-10 00:26:11

标签: c unix standards portability multiplexing

select(2)系统调用在Stevens,Fenner和Rudoff的Unix网络编程(2003)第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);

但现代Unix(如FreeBSD,OpenBSD,NetBSD,Linux,甚至POSIX [1]标准)都没有定义系统调用。但是,在书中注意到&#34; POSIX指定了const限定符&#34;。这本书中的错误是什么?或者,是因为历史原因?但是,所有系统都将pselect(2)定义为具有常量超时参数。

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

本书勘误表页面未​​将此列为错误:

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

1 个答案:

答案 0 :(得分:0)

POSIX定义select()的接口 为:

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

select()函数应该等效于pselect()函数,除非如下:

     
      
  • ...
  •   
  • 成功完成后,select()函数可能会修改超时参数指向的对象。
  •   

pselect函数采用const struct timespec * restrict timeout参数(POSIX定义中的相同页面)。

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