linux c中select使用技巧——计时器(转)
通过本文你会了解到:
1. select()原型及参数说明
2. select()应用情景
3. select()注意事项
4. select()作定时器
原型
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *utimeout);
参数说明 readfds
, writefds
, exceptfds
为所要监听的三个描述符集:
——readfds
监听文件描述符是否可读,不监听可以传入 NULL
——writefds
监听文件描述符是否可写 ,不监听可以传入 NULL
——exceptfds
监听文件描述符是否有异常,不监听可以传入 NULL
nfds
是 select()
监听的三个描述符集中描述符的最大值+1 timeout
设置超时时间
更详细信息请参考译文linux-select()
应用情景 select()
函数的重点在于它可以同时监控多个描述符(一般最大为1024),并且在描述符集中没有可操作的描述符时会进入睡眠状态。 实际应用中,若需要同时处理多个描述符的读写时,如果只是创建了一系列的read()
和write()
就会导致在有些描述符没有准备好读写时而被阻塞,这样当然不是我们期望的,因此这时就需要应用select()
。
注意事项
这段是select()
使用必须要了解和掌握的知识点,建议认真阅读,同时可以结合后续的一些实例做分析,相信你一定能掌握select()
使用方法。
nfds
必须被正确设置,一般取描述符集中描述符的最大值并加1。在非必须的情况下,尽量使用不超时的
select()
,即将utimeout
参数设置为NULL
。/*参数 timeout 置为 NULL*/
select(nfds, &readfds, &writefds, &exceptfds, NULL);timeout
的值必须在每次select()
之前重新赋值,因为操作系统会修改此值。while() {
timeout.tv_sec = ;
timeout.tv_usec = ;
select(nfds, &readfds, &writefds, &exceptfds, &timeout);
}由于
select()
会修改字符集,因此如果select()
调用是在一个循环中,则描述符集必须被重新赋值。/*以read操作为例*/
while() {
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
select(nfds, &readfds, NULL, NULL, NULL);
}函数
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;
}- 当
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使用技巧——计时器(转)的更多相关文章
- linux c中select使用技巧
1.select函数作为定时器使用 it_value.tv_sec = 0; it_value.tv_usec = 100000: select(1,NULL,NULL,NULL,& ...
- linux c中select使用方法
1.select函数作为定时器使用 it_value.tv_sec = 0; it_value.tv_usec = 100000: select(1,NULL,NULL,NULL,& ...
- find查找文件命令 - Linux系统中的常用技巧整理
“find”在Linux系统中是比较常用的文件查找命令,使用方法有很多,可以拥有查找文件.文件目录.文件更新时间.文件大小.文件权限及对比文件时间.下面是整理的“find”常用方法,方便以后需要的时候 ...
- linux find命令-print0和xargs中-0使用技巧(转载)
本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...
- linux find命令-print0和xargs中-0使用技巧
文章是转载的,原文很精彩,我对其中个别地方没有快速理解,我在此予以补充,方便后续回顾理解. 本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需 ...
- hive中select中DISTINCT的技巧和使用
hive中select中DISTINCT的技巧和使用 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- Linux的95个小技巧
Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...
- Linux命令行 3大技巧归纳
在软件开发的世界中,作为web端程序猿打交道最多的操作系统相信就是Linux系统了吧.而对于Linux系统的使用,如果能掌握一些小技巧,在程序开发.调试的过程中,相信做事的效率也会有一些提升.下面就和 ...
随机推荐
- 树莓派3b基于UbuntuMate下载中文输入法
输入命令:sudo apt-get install fcitx-sunpinyin,就可以下载中文输入法包了. 命令格式:sudo apt-get install package是下载安装包.apt- ...
- ASP.NET MVC中DropDownList的使用
Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MV ...
- Ionic2 window开发环境搭建
1.软件安装 Node.jsCordova & Ionic CLIJava SDK (一定要安装jre1.8)Android SDK 可根据链接http://www.jianshu.com/p ...
- 从1到整数n中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共出现了5次. 不考虑时间效率的解法: int Numbe ...
- HDU 1308 What Day Is It?(模拟,日期)
解题报告:输入一个年月日,让你求出那一天是星期几,但是做这题之前必须先了解一点历史.首先在1582年之前,判断是否是闰年的标准是只要能被四整除就是闰年, 然后在1752年9月2号的后的11天被抹去了, ...
- Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- NOI 1.5编程基础之循环控制 44:第n小的质数
描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29
- Oracle alter table modify column Syntax example
http://www.dba-oracle.com/t_alter_table_modify_column_syntax_example.htm For complete tips on Oracle ...
- 理解XML-RPC
有关XML-RPC http://baike.baidu.com/link?url=ejidFtjelUzPv75VBm5_XrzSbHtFgArYY47S1s1NK2_m-auOr10sTeRh6U ...
- 【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI
不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include ...