• 用select实现监控终端输入


    首先,从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!
    ");
    27     
    28     //4. 清空集合
    29     FD_CLR(STDIN,&fds);
    30     FD_ZERO(&fds);
    31     return 0;
    32 }
  • 相关阅读:
    边缘计算的爆发为安防全产业带来了怎样的变化?
    Kali卸载AWVS的方法
    C++最简打开网页的方法
    C# 打开指定文件或网址
    C# 如何获取某用户的“我的文档”的目录
    基于Debian的linux系统软件安装命令
    C#的基础知识
    MYSQL语句中的增删改查
    将博客搬至CSDN
    【易懂】斜率DP
  • 原文地址:https://www.cnblogs.com/Bro-Young/p/5766500.html
Copyright © 2020-2023  润新知