通过本文你会了解到: 
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. jquerycheckbox事件

    https://stackoverflow.com/questions/7031226/jquery-checkbox-change-and-click-event $(document).ready ...

  2. Go语言,互斥锁使用

    package main import ( "fmt" "runtime" "sync" ) var ( counter int wg sy ...

  3. linux基础学习目录

    以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...

  4. #!bin/sh是啥

    第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本,比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚 ...

  5. Nvidia 的新显卡架构 Maxwell 性能相比开普勒提升了多少?

    作者:喵西和熊链接:https://www.zhihu.com/question/22630075/answer/29041618来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. 数位dp模版(dp)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  7. Codeforces 856B - Similar Words

    856B - Similar Words 题意 如果一个字符串可以通过去掉首位字母得到另一个字符串,则称两个字符串相似. 给出一个字符串集合,求一个新的字符串集合,满足新集合里的字符串是原字符串集合中 ...

  8. linux历史命令

    "忘记历史的Linux用户注定要输入很多信息.” 这也让强有力的历史命令(包括Bash shell的历史变体)不仅在援引之前执行命令而不需重新输入它们时有用,在调用其它很少用到的命令时也有用 ...

  9. oracle to_char FM099999

    to_char(column,'FM099999') The FM in the format removes leading and trailing blanks.

  10. SQL Loader with utf8

    alter this line in your control file characterset UTF8 to this characterset UTF8 length semantics ch ...