LINUX下FD_SET介绍
刚刚了解了linux下select系统调用,函数原型是
#include <sys/select.h>
#include <sys/time.h>
int
select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
如何给readset, writeset, exceptset这3个参数中的每一个参数指定一个或多个描述符是一个设计上的问题。select使用描述符集,通常是一个整数数组,其中每一个整数中的每一位对应一个描述符。举例来说,假设使用32位整数,那么该数组的第一个元素对应于描述符0-31,第二个元素对应于32-63,依此类推。隐藏在名为fd_set的数据类型和以下四个宏:
void FD_ZERO(fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);
宏FD_SET设置文件描述符集fdset中对应于文件描述符fd的位(设置为1),宏FD_CLR清除文件描述符集fdset中对应于文件描述符fd的位(设置为0),宏FD_ZERO清除文件描述符集fdset中的所有位(即把所有位都设置为0)。使用这3个宏在调用select前设置描述符屏蔽位。因为这3个描述符集参数是值-结果参数,在调用select后,结果指示哪些描述符已就绪。使用FD_ISSET来检测文件描述符集fdset中对应于文件描述符fd的位是否被设置。描述符集内任何与未就绪描述符对应的位返回时均清成0,为此,每次重新调用select函数时,必须再次把所有描述符集内所关心的位置1.
通常,操作系统通过宏FD_SETSIZE来声明在一个进程中select所能操作的文件描述符的最大数目。许多系统实现有类似下面的声明,取自4.4BSD的<sys/types.h>:
#ifndef FD_SETSIZE
#define FD_SETSIZE 256
#endif
不过,更新的源自BSD的内核和源自SVR4的内核把它放在头文件<sys/select.h>中。
在linux下<sys/select.h>头文件中,是这样描述的:
/* Maximum number of file descriptors in `fd_set`. */
#define FD_SETSIZE _FD_SETSIZE
_FD_SETSIZE定义在/usr/include/linux下的posix_types.h中:
/*
*This macro may hava been defined in <gnu/types.h>. But we always use the one here.
*/
#undef _FD_SETSIZE
#define _FD_SETSIZE 1024
我们可以把FD_SETSIZE定义为某个更大的值以增加select所用描述符集的大小。不幸的是,这样做通常行不通。因为select是在内核中实现的,并把内核的FD_SETSIZE定义为上限使用。因此,增大FD_SETSIZE还要重新编译内核。值得注意的是,有些应用程序开始使用poll代替select,这样可以避开描述符有限问题。另为,select的典型实现在描述符数增大时可能存在扩展性问题。
有些厂家正在将select的实现修改为允许进程将FD_SETSIZE定义为比默认值更大的某个值,例如BSD/OS。然而,从程序的可移植性考虑,不建议这样使用。
LINUX下FD_SET介绍的更多相关文章
- .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础
基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...
- Linux下tmpfs介绍及使用
tmpfs介绍 tmpfs是一种虚拟内存文件系统,而不是块设备.是基于内存的文件系统,创建时不需要使用mkfs等初始化它最大的特点就是它的存储空间在VM(virtual memory),VM是由lin ...
- 06 Linux下Shell介绍
一.概述 每个人在成功登陆Linux后,系统会出现不同的提示符号,例如$,~,#等,然后你就可以开始输入需要的命令.若命令正确,系统就会依据命令的要求来执行,直到注销系统为止,在登陆到注销期间,输入的 ...
- 转://Linux下tmpfs介绍及使用
tmpfs介绍 tmpfs是一种虚拟内存文件系统,而不是块设备.是基于内存的文件系统,创建时不需要使用mkfs等初始化它最大的特点就是它的存储空间在VM(virtual memory),VM是由lin ...
- linux下定时器介绍1
POSIX Timer 间隔定时器 setitimer 有一些重要的缺点,POSIX Timer 对 setitimer 进行了增强,克服了 setitimer 的诸多问题: 首先,一个进程同一时刻只 ...
- linux下定时器介绍2--timer_create等函数集的使用示例
程序1:采用新线程派驻的通知方式 程序2:通知方式为信号的处理方式 #include <stdio.h>#include <time.h>#include <stdlib ...
- Linux下iptables介绍
ptables简介 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表. filter负责过滤数据包,包括的规则链有,input,outp ...
- LINUX下多路径的介绍和安装配置(测试未写完)
一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...
- Linux下multipath多路径配置
一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存 储通过了光纤交换机或者多块网卡及IP ...
随机推荐
- Cocos观察者设计模式和通报机制
观察员(Observer)模式也称为公告/订阅(Publish/Subscribe)模式.这是 MVC( 模型-视图-控制器)模型的重要组成部分.天气一直讨论的英国最喜欢的话题,近期天气变化几年已成为 ...
- UnitOfWork应用
UnitOfWork以及其在ABP中的应用 Unit Of Work(UoW)模式在企业应用架构中被广泛使用,它能够将Domain Model中对象状态的变化收集起来,并在适当的时候在同一数据库连接和 ...
- JAVA —— 文件输入输出
import java.io.*; public class FileIO { public static void main(String[] args) { //1.相对路径 File testF ...
- Codeforces Round #254 (Div. 2):A. DZY Loves Chessboard
A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...
- crmsql句子的实体关系实体字段的信息窗口
在crm里面怎样用sql语句查询这些信息? 查询实体信息: --查询实体信息,实体名称:account select * from MetadataSchema.Entity where name= ...
- (大数据工程师学习路径)第一步 Linux 基础入门----Linux 下软件安装
介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 从二 ...
- [DB][mybatis]MyBatis mapper文件引用变量#{}与${}差异
MyBatis mapper文件引用变量#{}与${}差异 默认,使用#{}语法,MyBatis会产生PreparedStatement中.而且安全的设置PreparedStatement參数,这个过 ...
- 《C++ Primer Plus》学习笔记6
<C++ Primer Plus>学习笔记6 第11章 使用类 <<<<<<<<<<<<<<<&l ...
- 深入了解Libgdx中间Skin分类
文不是直接翻译.. . 本文在Libgdx的官方wiki的基础上,加上一些自己的理解.所以,难免会一些甚至是非常多的理解非常片面的东西.写的不好,还请见谅.... 事实上 事实上.在LibGDX的官方 ...
- Unity + iBatis + Asp.net Mvc 系统搭建
Unity + iBatis + Asp.net Mvc 系统搭建 之前用EntityFramework Code First做了一些小项目,很是方便:后来在一个 Java 项目中接触了myBatis ...