Linux系统调用可以使我们监控多个文件句柄的状态,当没有文件句柄就绪时,程序会阻塞,直到有文件句柄状态发生变化。
#include <sys/select.h></span>select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, timeval *timeout);
readset、 writeset、exceptset:为文件描述符数组,是监控的文件描述符的集合;
timeout:select等待时
1、创建文件句柄、fd_set集合;
2、清空fd_set集合;
3、将文件句柄与fd_set关联;
使用以下宏对fd_set进行操作:
FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd 的位是否为真
FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位
FD_ZERO(fd_set *set);用来清除描述词组set的全部位
二、timeval结构体:
timeval{
tv_sec; /*秒*/
tv_usec; /*>微秒*/
}
1、timeout == NULL:一直阻塞,直到有文件句柄发生变化;
2、tv_sec == 0 && tv_sec == 0:立刻返回;
三、代码示例: 由监控标准输入,将内容写到文件中:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )
int main(int argc, char ** argv)
{
int res;
char c;
fd_set fds;
struct timeval tv;
char ch;
char buf[100];
int keyboard = open("/dev/tty",O_RDONLY | O_NONBLOCK);
int fd;
fd = open("output.txt", O_WRONLY | O_NONBLOCK);
//fd = 1;
keyboard = 0;
while(1)
{
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(keyboard, &fds);
FD_SET(fd, &fds);
int max = MAX(keyboard, fd);
res = select(max+1, &fds, &fds, NULL, &tv);
//printf("res = %d\n", res);
if (res > 0)
{
if (FD_ISSET(keyboard, &fds))
{
read(keyboard, buf, sizeof(buf[100]));
//read(keyboard, &c, sizeof(char));
//if ('\n' == c)
// continue;
//if ('q' == c)
// return 0;
if (FD_ISSET(fd, &fds))
{
write(fd, buf, sizeof(buf[100]));
}
}
}
}
return 0;
}