码迷,mamicode.com
首页 > 其他好文 > 详细

用select实现监控终端输入

时间:2016-08-12 21:39:37      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:

首先,从man手册里找到对select函数的描述,如下:


int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

其中:
   nfds : 指集合中所有文件描述符的范围,即所有文件描述符的最大值加1
   readfds / writefds : 监控文件读(写)属性,集合中有一个文件可读(写),返回值大于0;否则,根据timeout判断是否超时,若超时,返回值为0;若发生错误返回-1.若值为NULL,表示不关心集合中文件的读(写)属性。
   exceptfds : 监视文件异常错误
   timeout : 可以使select处于三种状态:
       1. NULL:阻塞,直到文件描述符集合中有文件发生变化为止;
       2. 0s 0ms: 非阻塞,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
       3. 大于0:在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

select : 监控fd集合变化
 FD_CLR 在fd集合删除某个fd
 FD_ISSET 测试fd集合中的某个fd是否可以读写
 FD_SET 向fd集合中添加fd
 FD_ZERO 清空fd集合

0 : stdin 1 : stdout 2 : stderr 

有了以上关于select的描述,下面附上程序:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/time.h>
 4 #include <sys/types.h>
 5 #include <unistd.h>
 6 
 7 
 8 #define STDIN 0
 9 
10 int main()
11 {
12     //1. 初始化fd集合
13     fd_set fds;//定义fd集合
14     FD_ZERO(&fds);//清空fd集合
15     FD_SET(STDIN,&fds);//添加STDIN
16     //2. 监控fd集合 - 遍历集合方式
17     int ret  = select(STDIN+1,&fds,NULL,NULL,NULL);
18     if(ret == -1)
19     {
20         perror("select");
21         exit(1);
22     }
23     
24     //3. 判断STDIN的读属性是否发生变化
25     if(FD_ISSET(STDIN,&fds))
26     printf("someone input a char!\n");
27     
28     //4. 清空集合
29     FD_CLR(STDIN,&fds);
30     FD_ZERO(&fds);
31     return 0;
32 }

 

用select实现监控终端输入

标签:

原文地址:http://www.cnblogs.com/Bro-Young/p/5766500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!