#include <sys/select.h>
int pselect
(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const struct timespec *tsptr,const sigset_t *sigmask);
返回值:准备就绪的描述符数,若超时则返回0,若出错则返回-1
除以下几点,pselect与select相同:
① 超时值精度
select的超时值用timeval结构指定,但pselect使用timespec,timespec结构以秒和纳秒表示超时值,而非秒和微妙。如果平台支持这样精细的粒度,那么timespec就提供了更精准的超时时间。
② 信号屏蔽集
对于pselect可使用一可选择的信号屏蔽字。若sigmask为空,那么在与信号有关的方面,pselect的运行状况和select相同。否则,sigmask指向一信号屏蔽字,在调用pselect时,以原子操作的方式安装该信号屏蔽字。在返回时恢复以前的信号屏蔽字。
**pselect的执行效果:**在调用select的整个过程中,屏蔽sigmask信号集中的信号。
ready = pselect(maxfdp1,&readfds,&writefds,&exceptfds,timeout,&sigmask);
等价于
sigset_t sigmask;
// 向 sigmask 中添加信号
sigset_t origmask;
sigprocmask(SIG_SETMASK,&sigmask,&origmask); //屏蔽sigmask,在origmask中保存当前信号屏蔽集
ready = select(maxfdp1,&readfds,&writefds,&exceptfds,timeout); //调用select
sigprocmask(SIG_SETMASK,&origmask,NULL); //将屏蔽信号集设为origmask