我们先看一下select的参数列表
- 参数解释
参数nfds是需要监视的最⼤大的⽂文件描述符值+1;
rdset,wrset,exset分别对应于需要检测的可读⽂文件描述符的集合,可写⽂文件描述符的集 合及异常⽂文 件描述符的集合;
参数timeout为结构timeval,⽤用来设置select()的等待时间
- 关于fd_set的接口
void FD_CLR(int fd, fd_set *set); // ⽤用来清除描述词组set中相关fd 的位 int >FD_ISSET(int fd, fd_set *set); // ⽤用来测试描述词组set中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set); // ⽤用来设置描述词组set中相关fd的位
void FD_ZERO(fd_set *set); // ⽤用来清除描述词组set的全部位
好了,有了这几个接口写一个select检测检测标准输入的代码吧
#include<stdio.h>
#include<fcntl.h>
#include<sys/select.h>
int main()
{
fd_set read_fds;
FD_ZERO(&read_fds);
FD_SET(0, &read_fds);
for(;;)
{
printf("test1_15");
fflush(stdout);
int ret = select(1,&read_fds, NULL, NULL,NULL);
if(ret < 0)
{
perror("select");
continue;
}
if(FD_ISSET(0, &read_fds))
{
char buf[1024] = {0};
read(0, buf, sizeof(buf) -1);
printf("input : %s ", buf);
}
else
{
printf("error ! invaild fd\n");
continue;
}
FD_ZERO(&read_fds);
FD_SET(0, &read_fds);
}
return 0;
}