select使用详解

1:首先需要定义保存你打开文件的文件描述符变量,和你要侦听的文件描述符集

   int cd_fd=0,rf_fd=0,max_fd;
   fd_set rd;

2:打开设备,保存文件描述符

      if((cd_fd=open_port(cd_fd,3))<0)
      {    
          perror("open_port error");
          return 0 ;
      }
      if((rf_fd=open_port(rf_fd,2))<0)
      {    
          perror("open_port error");
          return 0 ;
      }

3:初始化文件描述符集为0,并添加打开的设备到文件描述符集

   FD_ZERO(&rd);
      FD_SET(cd_fd, &rd);  ////添加之后FD_ISSET(cd_fd, &rd)返回值就变成1,就说名FD_ISSET是检测当前文件描述符时候在文件描述符集当中,如果是,就返回1.
      FD_SET(rf_fd, &rd);   //FD_ISSET(cd_fd, &rd)=1
      max_fd=((cd_fd>rf_fd)?cd_fd:rf_fd);

4:监听,并读取,写入操作

while(1)
    {
        if(select(max_fd+1, &rd, NULL,NULL,NULL)<0)  //对于监听多个文件,监听之后select就会把没有数据触发的文件的文件描述符删除掉。
        {
            perror("select fail ");
        }
        else
        {
            printf("2isset_cd=%d,2isset_rf=%d\n",FD_ISSET(cd_fd, &rd),FD_ISSET(rf_fd, &rd));/如果我第一次触发cd_fd设备,让其触发。FD_ISSET(cd_fd, &rd)=1,FD_ISSET(rf_fd, &rd)=0,也即把rf_fd文件描述符从文件描述符集中删除掉了
         
            if(FD_ISSET(cd_fd, &rd))
            {
                nread=read(cd_fd, cd_buff, COUNT);//card=14 rf=10
                {    
                    printf("cd_nread=%d, %s\n",nread, cd_buff);
                    //tcflush(cd_fd,TCIFLUSH);
                }
            }
            
            if(FD_ISSET(rf_fd, &rd))
            {
                nread=read(rf_fd, rf_buff, COUNT);//card=14 rf=10
                {
                    printf("rf_nread=%d, %s\n",nread, rf_buff);
                    //tcflush(rf_fd,TCIFLUSH);
                }

            }
            printf("3isset_cd=%d,3isset_rf=%d\n",FD_ISSET(cd_fd, &rd),FD_ISSET(rf_fd, &rd));
            
        }
     
        FD_ZERO(&rd);
        FD_SET(cd_fd, &rd);
        FD_SET(rf_fd, &rd);
    }

所以如果你想每个循环让select监测所有的文件,就必须在循环当中添加

FD_ZERO(&rd);
FD_SET(cd_fd, &rd);
FD_SET(rf_fd, &rd);让其所有的文件描述符再添加到文件描述符集当中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值