linux 同步io多路复用select

一:描述
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值