函数原型

  /* According to POSIX.1-2001 */
#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);//函数原型

描写叙述

       Three independent sets of file descriptors are watched.  Those listed in readfds will be watched to see if characters  become  avail‐
able for reading (more precisely, to see if a read will not block; in particular, a file descriptor is also ready on end-of-file),
those in writefds will be watched to see if a write will not block, and those in exceptfds will be watched for exceptions. On exit,
the sets are modified in place to indicate which file descriptors actually changed status. Each of the three file descriptor sets
may be specified as NULL if no file descriptors are to be watched for the corresponding class of events.
//该函数同意进程指示等待多个事件的不论什么一个发生。而且仅仅在有一个或多个事件发生或者经历一段指定的时间后才唤醒它
它仅仅有在例如以下四种情况下返回
1. 集合中的不论什么描写叙述符准备好读
2. 集合中的不论什么描写叙述符准备好谢
3. 集合中的不论什么描写叙述符有异常等待处理
4. 等待事件到达
       The time structures involved are defined in <sys/time.h> and look like

           struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

等待事件这个參数有三种可能

1.永远灯下去。仅在有一个描写叙述符准备好才返回。为此。我们把该參数设置为空指针

2.等待一段固定时间。在有一个描写叙述符准好好I/O才返回,可是不能超时;

3. 不等待,检查描写叙述符后马上返回,这时定时器的时间必须设置为0

返回值:

(1)正常情况下返回满足要求的文件描写叙述符个数。

(2)经过了timeout等待后仍无文件满足要求。返回0。

(3)假设select被某个信号中断,将返回-1并设置errno为EINTR;

(4)若出错。返回-1并设置对应的errno。

select的用法:

(1)将要监控的文件加入到文件描写叙述符集。

(2)调用select開始监控;

(3)推断文件是否发生变化;

系统提供四个宏对描写叙述符集进行操作:

void FD_SET(int fd, fd_set *fdset); //将文件描写叙述符fd加入到文件描写叙述符集fdset中。
void FD_CLR(int fd, fd_set *fdset); //从文件描写叙述符集fdset中清除文件描写叙述符fd;
void FD_ISSET(int fd, fd_set *fdset); //在调用select后使用FD_ISSET来检測文件描写叙述符集中的文件fd发生了变化
void FD_ZERO(fd_set *fdset);//清空文件描写叙述符集

以下看个样例。用select来监视stdin看何时有输入

root@wl-Lenovo-B590:/myworkspace/anvancdedprogramminginunix/mysourcecode/chapter11#   cat -n select.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4 #include <sys/types.h>
5 #include <unistd.h>
6
7 int
8 main(void)
9 {
10 fd_set rfds;
11 struct timeval tv;
12 int retval;
13
14 /* Watch stdin (fd 0) to see when it has input. */
15 FD_ZERO(&rfds);
16 FD_SET(0, &rfds);
17
18 /* Wait up to five seconds. */
19 tv.tv_sec = 5;
20 tv.tv_usec = 0;
21
22 retval = select(1, &rfds, NULL, NULL, &tv);
23 /* Don't rely on the value of tv now! */
24
25 if (retval == -1)
26 perror("select()");
27 else if (retval)
28 printf("Data is available now.\n");
29 /* FD_ISSET(0, &rfds) will be true. */
30 else
31 printf("No data within five seconds.\n");
32
33 exit(EXIT_SUCCESS);
34 }

编译后执行结果如图:

能够看到,五秒不输入则到达定时时间。有输入则会捕捉到

參考: UNIX网络编程

Linux Programmer's Manual

linux 下的select函数的更多相关文章

  1. linux c语言 select函数用法

    linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...

  2. linux c语言 select函数使用方法

    linux c语言 select函数使用方法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<un ...

  3. Linux下利用ioctl函数获取网卡信息

    linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv ...

  4. 【C/C++】Linux下使用system()函数一定要谨慎

    [C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...

  5. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  6. 【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。

    下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的. 两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没 ...

  7. Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  8. linux下实现rm()函数删除文件或目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...

  9. linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

随机推荐

  1. (WC2016模拟十八)Gangsters of Treeland

    HINT: $1\leq N,Q\leq 10^5$ 原题:CodeChef November Challenge 2013 - MONOPLOY 题解: 其实这题是[SDOI2017]树点涂色的弱化 ...

  2. 【Tool】Linux下的Spark安装及使用

    1. 确保自己的电脑安装了JAVA Development Kit JDK, 用来编译Java应用, 如 Apache Ant, Apache Maven, Eclipse. 这里是我们安装Spark ...

  3. Oracle日期的加减运算

    无论是DATE还是timestamp都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加 ...

  4. Linux学习02--Linux一切皆文件

    Linux学习第二部 Linux一切皆对象 啊啊啊啊啊,今天被学妹说太直了,嘤嘤嘤. 学习linux两三天了,前期感觉并不难,只是命令多,多记记多敲一敲就能都记住了.希望自己能够坚持下去吧! 下面是根 ...

  5. 【BZOJ 1406】 [AHOI2007]密码箱

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] \(x^2%n=1\) \(x^2-1 = k*n\) \((x+1)*(x-1) % n == 0\) 设\(n=a*b\) 对于 ...

  6. 【codeforces 370C】Mittens

    [题目链接]:http://codeforces.com/problemset/problem/370/C [题意] 给你n个人,每个人都有一双相同颜色的手套; 然允许在所有人之间交换手套; (每个人 ...

  7. hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)

    题目链接:pid=5137">点击打开链接 题目描写叙述:如今有一张关系网.网中有n个结点标号为1-n.有m个关系,每一个关系之间有一个权值.问从2-n-1中随意去掉一个结点之后,从1 ...

  8. EEPlat PaaS中的多租户数据隔离模式

    EEPlat PaaS支持三种租户的数据隔离技术:Sparce Column.tenantId字段隔离.每一个租户独立数据库. 1)Sparce Column,和Salesforce Appforce ...

  9. AppCan中标首都机场移动平台项目

    近日.正益无线AppCan依托东方航空.吉祥航空.国家电网.中化集团等大客户项目的丰富成功经验,凭借企业移动信息化建设的良好口碑.强大的移动化实施部署经验和高速响应的技术团队,在与多家国内外移动厂商比 ...

  10. C&C控制服务的设计和侦测方法综述——DDoS攻击,上传从宿主机偷窃的到的信息,定时给感染机文件加密勒索等。

    这篇文章总结了一些我在安全工作里见到过的千奇百怪的C&C控制服务器的设计方法以及对应的侦测方法,在每个C&C控制服务先介绍黑帽部分即针对不同目的的C&C服务器设计方法,再介绍白 ...