Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET

 在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。宏FD_ZERO、FD_SET、FD_CLR、FD_ISSET中“FD”即为file descriptor的缩写,下面来一一进行介绍。

       首先介绍一个重要的结构体:fd_set,它会作为下面某些函数的参数而多次用到,fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄。fd_set集合可以通过下面的宏来进行人为来操作。

1》FD_ZERO

用法:FD_ZERO(fd_set*);

用来清空fd_set集合,即让fd_set集合不再包含任何文件句柄。

2》FD_SET

用法:FD_SET(int ,fd_set *);

用来将一个给定的文件描述符加入集合之中

3》FD_CLR

用法:FD_CLR(int ,fd_set*);

用来将一个给定的文件描述符从集合中删除

4》FD_ISSET

用法:FD_ISSET(int ,fd_set*);

检测fd在fdset集合中的状态是否变化,当检测到fd状态发生变化时返回真,否则,返回假(也可以认为集合中指定的文件描述符是否可以读写)。

5》函数select

用法:int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

作用:用来够监视我们需要监视的文件描述符(读或写的文件集中的文件描述符)的状态变化情况。并能通过返回的值告知我们。

参数解释:

int maxfdp:集合中所有文件描述符的范围,为所有文件描述符的最大值加1。

fd_set *readfds:要进行监视的读文件集。

fd_set *writefds :要进行监视的写文件集。

fd_set *errorfds:用于监视异常数据。

struct timeval* timeout:select的超时时间,它可以使select处于三种状态:

第一,若将NULL以形参传入,即不传入时间结构,就是 将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;

第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数, 不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;

第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回。

struct timeval timeout; timeout.tv_sec = 0//秒 timeout.tv_usec = dwTimeout * 1000; //微秒 1毫秒 = 1000微秒

返回值介绍:

>0:被监视的文件描述符有变化

-1:出错

0 :超时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Host SMBus controller not enabled的解决方法

From: http://blog.csdn.net/starmlk/article/details/7982077 SMBus 目录 SMBus与I2C的差别SMBus 是 System Management Bus 的缩写,是1995年由Intel提出的,应用于移动PC和桌面PC系统中的低速率通讯。它主要是希望通过一条廉价并且功能强大的总线&…

gitlab服务器搭建

搭建教程:http://blog.csdn.net/discoverer100/article/details/51814171#reply

【Bugly干货分享】微信文件微起底Ⅰ

Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处 微信大家都在用,但微信的本地文件到底隐藏着什么样的信息呢…

如何使antd中table表格不换行

.ant-table-thead > tr > th{ white-space:nowrap; } .ant-table-row td{ white-space:nowrap; } 在对用的组件style加上上面代码

由旋转矩阵求旋转中心

在图像的复合变化过程中,通常会用到Matrix矩阵,一般的过程是先构造仿射变换矩阵,然后对图像进行仿射变换,如:围绕点(100,100)旋转30度(sin 30 0.5 ,cos 30 0.866)&…

git服务器搭建

本文主要记录在Ubuntu 16.04操作系统中搭建GitLab服务器的操作记录,以下是操作步骤(主要参考资料:https://about.gitlab.com/downloads/#ubuntu1604)。1.安装依赖包,运行命令sudo apt-get install curl openssh-server…

Ubuntu桌面版网络设置

先来说下我的经验吧,我觉得Ubuntu桌面版中网络配置最好的方法是用Network-Manager这个带界面的软件,因为桌面版中这个软件是自动启动的。理由如下: 1. 如果要把这个软件设置为开机时不启动,得执行:chkconfig network-…

ant-design之form-重置表单多个值

重置form表单中的某一个值或者一次重置多个值 watch: {databaseType: function(curr, old) {this.getMyTableData [];this.form.resetFields([databaseSource,"databaseName","tableName",""]);},},

2016matlab安装

百度云的下载链接(永久有效)链接:https://pan.baidu.com/s/1dGZB4q9 密码:pfl3Matlab用途:点击打开链接与网盘资源相对应的安装教程1.将网盘中的3个文件下载下来后,解压(在当前路径下&#xff0…

C#类、接口、虚方法和抽象方法-抽象类与接口的区别与联系

C#抽象类和接口之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意。其实,两者之间还是有很大的区别的。首先,以抽象类的方式定义一个公共的…

Nginx_查看并发连接数

通过查看Nginx的并发连接,我们可以更清除的知道网站的负载情况。Nginx并发查看有两种方法(之所以这么说,是因为笔者只知道两种),一种是通过 web界面,一种是通过命令,web查看要比命令查看显示的结…

struct作为map的key时,需要重载该结构体

当结构体作为map中的key时&#xff0c;这个结构体必须重载"<"运算符, 否则将出错&#xff0c;看我完整代码&#xff1a; #ifndef WIN32#include <string.h>#else#include <string>#endif#include <iostream>#include <map>using namespa…

解决vuex中store保存数据,刷新页面会清空得问题

1.在App.vue下加入 mounted() {window.addEventListener("unload", this.saveState);},methods: {saveState() {sessionStorage.setItem("state", JSON.stringify(this.$store.state));}}2.在store下的index.js文件下修改 state:sessionStorage.getItem(…

arm MMU详解

一、MMU的产生许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当时…

welcome

我的博客&#xff1a;http://www.tanglei.name转载于:https://blog.51cto.com/tl3shi/910602

二叉树的建立与三种遍历

树是一种数据结构&#xff0c;为什么叫它“树”&#xff0c;因为它倒过来就是一棵树 根在上&#xff0c;而叶在下 其概念主要有根、父、子、深、叶等&#xff0c; 如上图&#xff1a;A为这棵树的根 B为D的父&#xff0c;而D则为B的子 E、F、G互为兄弟, D也可以叫叶 这也是一棵深…

vue中如何设置和清除定时器setInterval

data中生明定时器 方法里使用和清除定时器

register_sysctl_table实现内核数据交互

Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式&#xff0c;通过这种方式&#xff0c;用户应用可以在内核运行的任何时刻来改变内核的配置参数&#xff0c;也可以在任何时候获得内核的配置参数。通常&#xff0c;内核的这些配置参数也出现在proc文件系统…

VMware10中安装Mac10.9.3

教程网上确实有&#xff0c;我主要参考这个&#xff1a;http://bbs.pcbeta.com/viewthread-1418055-1-1.html 但是我按它的步骤&#xff0c;用我自己下载的mac os x 10.9.3原版.dmg在启动系统时就是会失败&#xff0c;我试过提取里面的InstallESD.dmg(取了2次&#xff0c;第一…

cisco 交换机通过console 导入 IOS

准备说明&#xff1a; 电脑上安装有 SecureCRT 软件 导入 IOS&#xff1a; 第一步&#xff1a;使用 SecureCRT 连接上交换机。进入rommon 模式&#xff08;CtrlBreak组合键&#xff09; 第二部&#xff1a;设置波特率为115200.调整波特率&#xff0c;可以大大减少灌IOS的时间&a…