一:描述
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);//清除某个文件描述符
int FD_ISSET(int fd, fd_set *set);//测试某个文件描述符是否在集合中
void FD_SET(int fd, fd_set *set);//设置某个文件描述符
void FD_ZERO(fd_set *set);//初始为0
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
二:参数
函数中的参数nfds是最大的文件描述符加1;
typedef struct {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;
typedef __kernel_fd_set fd_set;
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
struct timespec {
long tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
参数timeout 可以是0,是select立即返回,这对polling有用;可以是NULL表示select可以无限期阻塞;
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t;
如果sigmask不为空,那么pselect会覆盖当前的信号掩码,然后执行select操作,最后回复原始信号掩码
ready = pselect(nfds, &readfds, &writefds, &exceptfds,
timeout, &sigmask);
等价于:
sigset_t origmask;
sigprocmask(SIG_SETMASK, &sigmask, &origmask);
ready = select(nfds, &readfds, &writefds, &exceptfds, timeout);
sigprocmask(SIG_SETMASK, &origmask, NULL);
之所以pselect有用是因为如果一个等待信号或一个文件描述符准备就绪,那么一个原子操作是必须的,为了避免竞争;
select和pselect是posix标准,两者基本相同不同之处,可以通过man select查看到
三:返回值
成功:返回三个描述符集合中的文件描述符之和;
失败:-1
超时:0
linux 同步io多路复用select
最新推荐文章于 2024-05-08 13:00:29 发布