1. 函数原型
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
struct timeval
{
time_t tv_sec; //秒
long tv_usec; //微秒
};
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout);
struct timespec
{
long tv_sec; //秒
long tv_nsec; //纳秒
};
int pselect(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timespec* timeout, const sigset_t* sigmask);
2. 区别
(1) pselect()超时的时间结构是一个纳秒级的结构,不过在Linux平台下内核调度的精度为10毫秒级,所以即使设置了纳秒级的数值,也达不到设置的精度。
(2) pselect()增加了进入函数时替换掉的信号处理方式,当sigmask为NULL的时候,与select的方式一样。
(3) select()函数在执行之后可能会改变timeout的值,修改为还有多少时间剩余,而pselect()函数不回修改该值。
pselect(nfds, &readfds, &writefds, &exceptfds, timeout, &sigmask);
相当于如下的select()函数,在进入select()函数之前手动将信号的掩码改变,并保存之前的掩码值;select()函数执行之后,再恢复为之前的信号掩码值。
sigset_t origmask;
sigprocmask(SIG_SETMASK, &sigmask, &origmask);
select(nfds, &readfds, &writefds, &exceptfds, timeout);
sigprocmask(SIG_SETMASK, &origmask, NULL);