(注意:在前面我实现过利用I/O函数select实现多个客户机与服务机之间的同时交互,是先定义了一个数组用来存存放服务机的套接字和连接到服务机的每个客户机所对应的文件描述符,然后再一一利用FD_SET放进集合中让select函数监视着,在下面的代码中,可以直接对比出,我并没有像之前一样先定义一个存放所有文件描述符的数组,这样做是因为现在我想要做的是将从键盘输入的字符直接打印在屏幕上,所以这里的select函数只需要监视一个文件描述符--STDIN所以并不需要数组存放)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#define STDIN 0 //将键盘的文件描述符定义为宏,用STDIN代替
int main()
{
int fd = STDIN;
fd_set fdset;//构建一个集合
while(1)
{
FD_ZERO(&fdset); //将集合里面的文件描述符清空
FD_SET(STDIN, &fdset);//把键盘的描述符添加到集合里面
struct timeval = {5, 0};
int n = select(fd+1, &fdset, NULL, NULL, &tv);
if( n < 0)//返回值小于0代表select函数自身发生了错误,输出一个错误后继续监视集合里面的文件描述符
{
printf("select error\n");
continue;
}
if( n == 0)//select返回0代表在定义的时间一个周期内集合里面的文件描述符没有一个是读就绪情况,于是继续监视集合
{
printf("time out!\n");//输出超时提示
continue;
}
else//如果返回的是一个大于0的值,就代表集合内有文件描述符读就绪
{
char buff[128] = {0};//buff用来存放就绪描述符上的数据
read(STDIN, buff, 127);//在STDIN上读取127个字符存放在buff中
printf("read buff = %s\n",buff);//输出STDIN传来的数据
}
}
exit(0);
}