Linux 系统编程之select
select 允许单个程序监听多个文件描述符,直到一个或者多个文件描述符准备就绪不阻塞系统,常常用于解决阻塞型的程序
相关代码
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
//nfds:集合的最大值 + 1
//readfds:监测fds中可读的fd
//writefds:监测fds中可写的fd
//exceptfds:fds中异常的fd 如果没有可监视对应类的文件描述符,可把这三个置NULL
//timeout:指定select阻塞等待文件描述符的时间 0:不阻塞等待,立即返回 NULL:无限期阻塞等待
//return: fail:-1 sucess: 包含在fds中fd 超时:0
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set); //把fd从集合中移除
int FD_ISSET(int fd, fd_set *set); //判断fd是否在集合中
void FD_SET(int fd, fd_set *set); //添加fd到集合中
void FD_ZERO(fd_set *set); //清空集合
#include <sys/time.h>
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
example
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
fd_set fds;
struct timeval timeout;
int ret;
FD_ZERO(&fds);
FD_SET(0, &fds);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
ret = select(1, &fds, NULL, NULL, &timeout);
if(ret == -1)
perror("select fail");
else if(ret == 0)
perror("select timeout");
else {
printf("start read fata");
#判断fd是否在fds中 开始处理
FD_ISSET(0, &fds);
}
}