C语言 select函数使用

在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使用selcet函数就可以实现非阻塞编程。


selcet函数是一个轮循函数,即当循环询问文件节点,可设置超时时间,超时时间到了就跳过代码继续往下执行。


例子:

fd_set readfd;
struct timeval timeout;

FD_ZERO(&readfd);   //初始化readfd
FD_SET(gps_fd, &readfd);   //把gps_fd加入readfd
timeout.tv_sec = 3;   //设置3秒超时
timeout.tv_usec = 0;

j = select(gps_fd+1, &readfd, NULL, NULL, &timeout);   //用select对gps_fd进行轮循
if( j>0 ){
    if( FD_ISSET(gps_fd, &readfd) ){   //如果gps_fd可读
        i = read(gps_fd, buf, SIZE);
        buf[i] = '\0';
    }
}
select函数有5个参数

第一个是所有文件节点的最大值加1,如果我有三个文件节点1、4、6,那第一个参数就为7(6+1)

第二个是可读文件节点集,类型为fd_set。通过FD_ZERO(&readfd);初始化节点集;然后通过FD_SET(fd, &readfd);把需要监听是否可读的节点加入节点集

第三个是可写文件节点集中,类型为fd_set。操作方法和第二个参数一样。

第四个参数是检查节点错误集。

第五个参数是超时参数,类型为struct timeval,然后可以设置超时时间,分别可设置秒timeout.tv_sec和微秒timeout.tv_usec。

然后调用select函数,用FD_ISSET()函数判断节点是否可读写。返回值不为0表示可读写,为0表示不可读写。select函数的返回值为是一个整数,表示有几个节点可读写。


  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值