通过本文你会了解到: 
1. select()原型及参数说明 
2. select()应用情景 
3. select()注意事项 
4. select()作定时器

原型

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

参数说明 
readfdswritefdsexceptfds为所要监听的三个描述符集: 
——readfds 监听文件描述符是否可读,不监听可以传入 NULL 
——writefds 监听文件描述符是否可写 ,不监听可以传入 NULL 
——exceptfds 监听文件描述符是否有异常,不监听可以传入 NULL 
nfds 是 select() 监听的三个描述符集中描述符的最大值+1 
timeout 设置超时时间 
更详细信息请参考译文linux-select()

应用情景 
select() 函数的重点在于它可以同时监控多个描述符(一般最大为1024),并且在描述符集中没有可操作的描述符时会进入睡眠状态。 实际应用中,若需要同时处理多个描述符的读写时,如果只是创建了一系列的read()write()就会导致在有些描述符没有准备好读写时而被阻塞,这样当然不是我们期望的,因此这时就需要应用select()

注意事项 
这段是select()使用必须要了解和掌握的知识点,建议认真阅读,同时可以结合后续的一些实例做分析,相信你一定能掌握select()使用方法。

  1. nfds必须被正确设置,一般取描述符集中描述符的最大值并加1。
  2. 在非必须的情况下,尽量使用不超时的select(),即将utimeout参数设置为NULL

     /*参数 timeout 置为 NULL*/
    select(nfds, &readfds, &writefds, &exceptfds, NULL);
  3. timeout的值必须在每次select()之前重新赋值,因为操作系统会修改此值。

     while() {
    timeout.tv_sec = ;
    timeout.tv_usec = ;
    select(nfds, &readfds, &writefds, &exceptfds, &timeout);
    }
  4. 由于select()会修改字符集,因此如果select()调用是在一个循环中,则描述符集必须被重新赋值。

     /*以read操作为例*/
    while() {
    FD_ZERO(&readfds);
    FD_SET(fd, &readfds);
    select(nfds, &readfds, NULL, NULL, NULL);
    }
  5. 函数read()write()recv()send()以及select()可能会返回-1并且errno置位为EINTR,或这errno被赋值为EAGAIN(EWOULDBLOCK),这种情况需要被正确处理。如果程序中不接收任何信号,则不会得到EINTR。如果程序设为阻塞I/O,则不会收到EAGAIN。

     /*一般只需对EINTR进行处理就可以了,例子如下*/
    while() {
    ret = select(nfds, &readfds, NULL, NULL, NULL);
    if(ret == - && errno == EINTR)
    continue;
    }
  6. read()write()recv()send()返回0时建议关闭描述符并在字符集中移除此描述符(不关闭描述符并移除的话可能会导致未知错误,还是对此情况处理的好)。

定时器 
在没有usleep函数的系统中,可以应用select来实现,下例中实现了0.2秒的延时:

 struct timeval tv;
tv.tv_sec = ;
tv.tv_usec = ; /* 0.2 秒*/
select(, NULL, NULL, NULL, &tv);

linux c中select使用技巧——计时器(转)的更多相关文章

  1. linux c中select使用技巧

    1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,& ...

  2. linux c中select使用方法

    1.select函数作为定时器使用    it_value.tv_sec = 0;    it_value.tv_usec = 100000:    select(1,NULL,NULL,NULL,& ...

  3. find查找文件命令 - Linux系统中的常用技巧整理

    “find”在Linux系统中是比较常用的文件查找命令,使用方法有很多,可以拥有查找文件.文件目录.文件更新时间.文件大小.文件权限及对比文件时间.下面是整理的“find”常用方法,方便以后需要的时候 ...

  4. linux find命令-print0和xargs中-0使用技巧(转载)

    本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...

  5. linux find命令-print0和xargs中-0使用技巧

    文章是转载的,原文很精彩,我对其中个别地方没有快速理解,我在此予以补充,方便后续回顾理解. 本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需 ...

  6. hive中select中DISTINCT的技巧和使用

    hive中select中DISTINCT的技巧和使用 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 ...

  7. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  8. Linux的95个小技巧

    Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...

  9. Linux命令行 3大技巧归纳

    在软件开发的世界中,作为web端程序猿打交道最多的操作系统相信就是Linux系统了吧.而对于Linux系统的使用,如果能掌握一些小技巧,在程序开发.调试的过程中,相信做事的效率也会有一些提升.下面就和 ...

随机推荐

  1. 学习apache commons lang3的源代码 (2):RandomStringUtils

    本文,主要是分析类;RandomStringUtils. 下面这个方法的:count:表示要生成的数量(比如4个字符组成的字符串等) start,end,表示限定的范围,比如生成ascii码的随机等. ...

  2. 前段基础HTML

    HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...

  3. unity制作简单血条

    学习Unity已经10天了,也没发现有什么长进,真的急.昨天仿着官方Demo做了个射击游戏轮廓,其中需要给每个怪做一个血条. 搜了一些,挺复杂的,用NGUI或者UGUI,外加很长的代码...不过还是找 ...

  4. 计蒜客 31458.Features Track-滚动数组+STL(map)连续计数 (ACM-ICPC 2018 徐州赛区网络预赛 F)

    F. Features Track Morgana is learning computer vision, and he likes cats, too. One day he wants to f ...

  5. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

  6. hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会

    1468 : 2-SAT·hihoCoder新春晚会 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 hihoCoder新春晚会正在紧张地筹备中.晚会分为上半场和下半场, ...

  7. 一个Sqrt函数引发的血案

    源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算 ...

  8. 【DFS】Gym - 101142C - CodeCoder vs TopForces

    就按照题意建出有向图来(n个点,2n-2条边),然后从按随便一个rating排序,从最后一个开始dfs,用vis数组防止重复访问,因为每次之前的肯定能访问之后的(及之后的能访问的),所以不会有重复.就 ...

  9. 1.2(学习笔记)Servlet基础(doGet、doPost、生命周期、页面跳转)

    一.doGet()与doPost() 我们在TestServlet类中重写doGet().doPost().service(). import javax.servlet.ServletExcepti ...

  10. PythonGUI编程--向列表框添加滚动条

    代码如下: from tkinter import * window = Tk() window.title("New England") yscroll = Scrollbar( ...