c_select 调用参数说明-程序员宅基地

技术标签: 数据结构与算法  

c_select 调用

1. select系统调用
select系统调用是用来让我们的程序监视多个文件描述符的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有某一个或多个发生了状态改变。
select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪些Socket或文件可读可写。
select函数原型:
#include <sys/select.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

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


ndfs:select监视的文件句柄数,视进程中打开的文件数而定,一般设为要监视各文件中的最大文件描述符值加1。
readfds:这个文件描述符集合监视文件集中的任何文件是否有数据可读,当select函数返回的时候,readfds将清除其中不可读的文件描述符,只留下可读的文件描述符。
writefds:这个文件描述符集合监视文件集中的任何文件是否有数据可写,当select函数返回的时候,writefds将清除其中不可写的文件描述符,只留下可写的文件描述符。
exceptfds:这个文件集将监视文件集中的任何文件是否发生错误,其实,它可用于其他的用途,例如,监视带外数据OOB,带外数据使用MSG_OOB标志发送到套接字上。当select函数返回的时候,exceptfds将清除其中的其他文件描述符,只留下标记有OOB数据的文件描述符。
timeout:本次select()的超时结束时间。这个参数至关重要,它可以使select处于三种状态:
(1)若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;
(2)若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
(3)timeout的值大于0,这就是等待的超时时间,即select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。
函数的返回值:
正值:表示监视的文件集中有文件描述符符合要求
零值:表示select监视超时
负值:表示发生了错误,错误值由errno指定。
宏操作:
FD_ZERO(fd_set *set): 用来清除描述词组set的全部位
FD_SET(int fd,fd_set*set): 用来设置描述词组set中相关fd的位
FD_ISSET(int fd,fd_set *set): 用来测试描述词组set中相关fd 的位是否为真
FD_CLR(inr fd,fd_set* set): 用来清除描述词组set中相关fd 的位注意事项:
(1)对于可写性的检查,最好放在需要写数据的时候进行检查。如果和可读性放在同一个地方进行检查,那么select很可能每次都会因为可写性检查成功而返回。 
(2)select()调用会清空传递给它的集合参数中的内容,也就是会清空readfds、writefd、exceptfds这三个指针参数所指定的描述符集合。因此,在每次调用select()之前,必须重新初始化并把需要监视的描述符填写到相应的描述符集合中。select()调用也会清空timeout指针所指向的struct timeval结构,所以在每次调用select()之前也要重新填充timeout指针所指向的struct timeval结构。

转载于:https://www.cnblogs.com/allensun-193/p/4889598.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30698297/article/details/98521438

智能推荐

vue cdn实现el-image默认预览效果_el-image 默认文字-程序员宅基地

文章浏览阅读1.6k次。网上基本上都是import引入el-image-viewer这个隐藏小组件但是现在是在原来非vue项目里要用到这个预览功能尝试了半天,cdn也没办法引入这个组件。然后看到有分析这个组件源码,点击img,是执行了clickHandler方法。且判断依据是showViewer= !0的时候,将这一句改为:showViewer: !0效果实现。如果有机会,我还是想知道如何cdn引入按需这个小组件的…..._el-image 默认文字

一文速懂利用python字典的引用传递实现循环套娃(嵌套)_dict引用套娃-程序员宅基地

文章浏览阅读843次。0 写在前面最近看到一篇CSDN,里面巧妙运用了字典的引用传递和dict.setdefault(key, default=None)方法,有点绕打算细细记录一下。本篇的中心思想在于实现字典嵌套方面。1 一马当先首先看如下demodata = {}tmp = {'b': 1}data['a'] = tmpprint(data) # {'a': {'b': 1}}以上是没有使用引..._dict引用套娃

怎么查看8080端口被占用详细教程_8080端口查看-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏21次。开始---->运行---->cmd,或者是window+R组合键,调出命令窗口输入命令:netstat -ano,列出所有端口的情况。查找8080端口打开任务管理器:Ctr+Alt+. 或 Ctr+Shift+Esc看找 PID : 47645. 右键,结束任务..._8080端口查看

几个分形的matlab实现1,几个分形的matlab实现-程序员宅基地

文章浏览阅读921次。几个分形的matlab实现摘要:给出几个分形的实例,并用matlab编程实现方便更好的理解分形,欣赏其带来的数学美感关键字:Koch曲线 实验 图像一、问题描述:从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下图1在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成Koch分形曲线。 二、算..._分形代码maltarb

Android去掉SrollView、GrdiView、RecycleView、ViewPager等可滑动控件滑动到边缘的光晕效果_scollerview去掉光晕-程序员宅基地

文章浏览阅读280次。下面以RecycleView为例,其他可滑动控件也是一样的在XML中设置:<android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_recycle_view"android:layout_width=“match_parent”android:layout_height=“match_parent”android:scr..._scollerview去掉光晕

json_encode 和 serialize(一)_serialize 和json_encode-程序员宅基地

文章浏览阅读3.6k次。今天在看书的时候(作为一个菜鸟,看书是必须滴 嘿嘿),看到了序列化,php的序列化一般使用serialize和json_encode,按照之前的学习方法,我可能就只会把这个两个函数的用法区别搞清楚下就pass继续看其他内容了,但是之前在csdn博客上看到李运华老师的博客再结合平时师傅提醒的学习方法,感觉之前的老方法不是一个合格的程序员应该做的,作为一个程序员,合格的程序员应该善于挖掘(师傅说的),_serialize 和json_encode

随便推点

WPF Language/Resources.resx 总是加载不成功-程序员宅基地

文章浏览阅读145次。打开.csproject文件把Properties\Resources.Designer.cs相关的东西都删掉,就解决了这个问题了。 <Compile Include="Properties\Resources.Designer.cs"> <AutoGen>True</AutoGen> <DesignTime>True&l..._wpf 加载resx文件

互联网公司的“敏捷开发”流程是怎么样的,每个职位的角色和分工是什么?_敏捷开发中各个角色的职责-程序员宅基地

文章浏览阅读1.8w次,点赞12次,收藏33次。这里是修真院前端小课堂,本篇分析的主题是【互联网公司的“敏捷开发”流程是怎么样的,每个职位的角色和分工是什么?】前言================================================1.本回答从属于“IT修真院”收藏夹系列第二篇,第一篇是IT职业介绍。第一篇对IT职业做了一个相对深入的介绍,给了想从事互联网职业的人一个了解各个职业的机会,已经有40..._敏捷开发中各个角色的职责

使用 sysdig 进行监控和调试 linux 机器_sysdig 如何获取process name-程序员宅基地

文章浏览阅读3.3k次。sysdig 简介sysdig 官网上对自己的介绍是:Open Source Universal System Visibility With Native Contaier Support.它的定位是系统监控、分析和排障的工具,其实在 linux 平台上,已经有很多这方面的工具 strace、tcpdump、htop、iftop、lsof、netstat,它们都能用来分析 linux 系统的运行情况,而且还有很多日志、监控工具。为什么还需要 sysdig 呢?在我看来,sysdig 的优._sysdig 如何获取process name

有道云笔记不需要开通会员即可导出思维导图的方法_有道云思维导图怎么导出-程序员宅基地

文章浏览阅读1.2w次,点赞4次,收藏15次。有道云笔记不需要开通会员即可导出思维导图的方法辛辛苦苦在有道云画了个思维导图,想要导出成png放到markdown文档里面做引用,结果发现居然要开会员,会员还贼贵,穷苦人家开不起会员咋办咧?当然是搞事情啊,劳资有一万种方法把图扒下来(滑稽脸下面介绍扒图方法,首先你需要一个chrome浏览器,然后准备两个插件:有道云笔记全屏插件(本仓库插件)Full Page Screen Captur..._有道云思维导图怎么导出

绘图和可视化 《利用Python进行数据分析》第8章 读书笔记_switch好玩吗-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏10次。绘图和可视化回归 第八章代码下载链接import matplotlib.pyplot as pltimport numpy as npfrom numpy.random import randnplt.plot(np.arange(10))plt.show()Figure和Subplotfig=plt.figure()ax1=fig.add_subplot(2,2,1)ax2=fig.a_switch好玩吗

一文读懂索引(覆盖索引,最左匹配原则)_覆盖索引 a,b,c a = 1 and b > 1 and c = 1 走索引吗, a = 1 a-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏11次。1. 什么是索引索引是帮助数据库高效获取数据的数据结构。简而言之,索引是数据结构2. 索引的底层数据结构2.1 Hash索引哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近 O(1))。为何能够通过 key 快速取出 value呢? 原因在于 哈希算法(也叫散列算法)。通过哈希算法,我们可以快速找到 value 对应的 index,找到了 index 也就找到了对应的 value。index = hash % array.size()_覆盖索引 a,b,c a = 1 and b > 1 and c = 1 走索引吗, a = 1 and b = 1 and c