原文: select manual page

依赖的头文件

/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h> /* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

方法定义

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set); int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask);

特征

select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (e.g., input possible). A file descriptor is considered ready if it is possible to perform a corresponding I/O operation (e.g., read(2) without blocking, or a sufficiently small write(2)).

select和pselect方法可以监听多个fd,直到其中的一个或多个准备好可以进行读取或写入操作。

select() can monitor only file descriptors numbers that are less than FD_SETSIZE; poll(2) does not have this limitation.

select只可以同时监听最多FD_SETSIZE个文件描述法,而poll则没有最大限制。

The operation of select() and pselect() is identical, other than these three differences:

(i) select() uses a timeout that is a struct timeval (with seconds and microseconds), while pselect() uses a struct timespec (with seconds and nanoseconds).

(ii) select() may update the timeout argument to indicate how much time was left. pselect() does not change this argument.

(iii) select() has no sigmask argument, and behaves as pselect called with NULL sigmask.

select和pselect的区别主要有三点:

1)select使用了timeval类型的timeout(单位为秒和毫秒),pselect使用的是timespec(单位是秒和纳秒)

2)select可以更新timeout的值而pselect不可以

3)select没有sigmask参数,与pselect使用值为NULL的sigmask的参数时效果相同

参数解释

Three independent sets of file descriptors are watched. The file

descriptors listed in readfds will be watched to see if characters

become available for reading (more precisely, to see if a read will

not block; in particular, a file descriptor is also ready on end-of-

file). The file descriptors in writefds will be watched to see if

space is available for write (though a large write may still block).

The file descriptors in exceptfds will be watched for exceptional

conditions.

三个独立的文件描述符集合被监听,其中readfds中的fd被监听是否可读,writefds被监听是否可写,exceptfds被监听是否有异常状态。

On exit, each of the file descriptor sets is modified in place to

indicate which file descriptors actually changed status. (Thus, if

using select() within a loop, the sets must be reinitialized before

each call.)

当函数退出时,每个fd集合都可能被修改,因此当在循环中使用select函数时,要记得每次重新初始化fd 集合。

Four macros are provided to manipulate the sets. FD_ZERO() clears a

set. FD_SET() and FD_CLR() respectively add and remove a given file

descriptor from a set. FD_ISSET() tests to see if a file descriptor

is part of the set; this is useful after select() returns.

四个宏命令可以用来操作这些fd集合:

FD_ZERO()用来清空fd集合;

FD_SET()FD_CLR()分别用来向fd集合添加和删除一个fd;

FD_ISSET()用来查看一个fd是否属于某一个fd集合,该方法通常在select返回后使用。

nfds should be set to the highest-numbered file descriptor in any of

the three sets, plus 1. The indicated file descriptors in each set

are checked, up to this limit

nfds参数应该被设置成三个fd集合的数量最大值加一,这样每个fd集合中的fd都可以被check一次。我理解是FD_ISSET宏会根据这个值去遍历每个fd集合。

The timeout argument specifies the interval that select() should

block waiting for a file descriptor to become ready. The call will

block until either:

  • a file descriptor becomes ready;
  • the call is interrupted by a signal handler; or
  • the timeout expires.

If both fields of the timeval structure are zero, then select()

returns immediately. (This is useful for polling.) If timeout

is NULL (no timeout), select() can block indefinitely.

timeout参数用来设置select阻塞的时间,直到其中一个fd可以进行读写,或者中断,或者超时。如果timeout设为0则select会立刻返回(轮询时很有用),设为NULL则select函数会一直阻塞下去。

sigmask is a pointer to a signal mask (see sigprocmask(2)); if it is

not NULL, then pselect() first replaces the current signal mask by

the one pointed to by sigmask, then does the "select" function, and

then restores the original signal mask.

错误类型

EBADF An invalid file descriptor was given in one of the sets.

(Perhaps a file descriptor that was already closed, or one on

which an error has occurred.) However, see BUGS.

EINTR A signal was caught; see signal(7).

EINVAL nfds is negative or exceeds the RLIMIT_NOFILE resource limit

(see getrlimit(2)).

EINVAL The value contained within timeout is invalid.

ENOMEM Unable to allocate memory for internal tables.

返回值

On success, select() and pselect() return the number of file

descriptors contained in the three returned descriptor sets (that is,

the total number of bits that are set in readfds, writefds,

exceptfds) which may be zero if the timeout expires before anything

interesting happens. On error, -1 is returned, and errno is set to

indicate the error; the file descriptor sets are unmodified, and

timeout becomes undefined.

select执行成功时,会返回三个fd集合的fd总数量。超时时返回值为0。发生错误时返回-1,可以通过errno的值查看报错信息。

代码示例

   #include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds);
FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 5;
tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */ if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n"); exit(EXIT_SUCCESS);
}

【socket编程】select manual page翻译的更多相关文章

  1. windows socket编程select模型使用

    int select(         int nfds,            //忽略         fd_ser* readfds,    //指向一个套接字集合,用来检测其可读性       ...

  2. socket编程的select模型

    在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的 ...

  3. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  4. Socket编程实践(10) --select的限制与poll的使用

    select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或 ...

  5. socket编程以及select、epoll、poll示例详解

    socket编程socket这个词可以表示很多概念,在TCP/IP协议中“IP地址 + TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP + 端口号”就称为socket.在TCP协议中,建立 ...

  6. Socket编程(C语言实现):socket()函数英文翻译

    最近开始研究使用Socket API来网络编程,想着把自己的感想.感悟写下来.我发现在编程之外还有不少概念性的东西要学习.我觉得应该有以下几点吧: 1.得了解下计算机网络的基本概念,如OSI的7层模型 ...

  7. c++中Socket编程(入门)

    转载 :http://www.cnblogs.com/L-hq815/archive/2012/07/09/2583043.html 但该作者也是转载,国外网站翻译之作 本人在学习Socket编程时, ...

  8. #include <sys/epoll.h> epoll - I/O event notification facility 服务器端 epoll(7) - Linux manual page http://www.man7.org/linux/man-pages/man7/epoll.7.html

    epoll使用详解(精髓) - Boblim - 博客园 https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html epoll使用详解(精髓) ...

  9. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

随机推荐

  1. windows平台python 2.7环境编译安装zbarlight

    类似于前一篇博文,http://www.cnblogs.com/zhongtang/p/7148082.html中描述的情况. 编译zbarlight同样出现问题,简要处理步骤如下: 1.到https ...

  2. Redis进阶实践之三如何在Windows系统上安装安装Redis

    一.Redis的简介        Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...

  3. windows sevser 2012搭建网站

    1,首先去服务器配置,从哪里下载iis8.0和asp.net和net.xx和web服务,iis控制,ftp等等服务根据自己的需求安装 安装好后把默认的网站删除掉.或者新建一个网站,把服务端口改为其他端 ...

  4. 前端 IoC 理念入门

    背景 近几年,前端应用(WebApp)正朝着大规模方向发展,在这个过程中我们会对项目拆解成多个模块/组件来组合使用,以此提高我们代码的复用性,最终提高研发效率. 在编写一个复杂组件的时候,总会依赖其他 ...

  5. 统计0到n之间1的个数[数学,动态规划dp](经典,详解)

    问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数.  例如:N=2时 1,2出现了1个 “1” . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个 ...

  6. HDU 2289 Cup【高精度,二分】

    Cup Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. Codeforces Round #452 (Div. 2)-899A.Splitting in Teams 899B.Months and Years 899C.Dividing the numbers(规律题)

    A. Splitting in Teams time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. load和DOMContenLoaded的区别

    load和DOMContentLoaded的作用就是当页面加载完成的时候自动执行,但他们执行的时间点是不一样的. DOM文档加载步骤: (1)解析html结构 (2)加载外部脚本和样式表文件 (3)解 ...

  9. for语句,你真正搞懂了吗?

    今天看书时,无意间看到了这个知识点,啥知识点?也许在各位大神看来,那是再简单不过的东西了. 说来惭愧.原来直到今天我才真正搞懂for语句. for语句的结构如下所示: for(语句A;语句B;语句C) ...

  10. Oracle_group by分组查询_深入

    Oracle_group by分组查询_深入 本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.                    创建分 ...