Select

#include <sys/time.h>
#include <sys/types.h>
#include <sys/unistd.h>

int select (int n, fd_set readfds, fd_set writefds, fd_set exceptfds, struct timeval timeout);

FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);

FD_ZERO(fd_set *set);

调用select 将受到阻塞,必须等到指定的文件描述符就绪可进行I/O,或者等到一个指定的事件限额过去。

此调用所监视的文件描述符分为三种事件类型,每个等待不同的事件。readfds中的文件描述符是准备读取的;writefds 分组中的文件描述符是准备写入数据的; exceptfds 分组的中的文件描述符是用于查看是否有异常发生或紧急数据可用。这三个分组可以是NULL,在此情况下 select() 将无法监视相应的事件。

此调用返回后,每个分组只会包含就绪可进行I/O的文件描述符。

第一个参数 n 等于任何分组中最高编号的文件描述符的值加1。

timeout 参数是一个指向 timeval 结构的指针,该结构的定义如下:
struct timeval {

long tv_sec;

seconds long tv_usec;

microseconds

};

如果此参数不是 NULL,则 select() 调用将在 tv_sec 秒与 tv_usec 微秒之后返回,即使尚无任何文件描述符就绪可进行I/O。如果 timeout 的这两个值都被设为零,则此调用会立即返回,报告此调用进行的时候是否有任何事件等待处理,但是不会等待其后的任何事件。

fd_set writefds;
FD_ZERO(&writefds);
FD_SET(fd,&writefds); //将fd加入分组
FD_CLR(fd,&writedfds); //从分组移除fd 
FD_ISSET(fd,&writefds); //测试特定文件描述符是否已就绪 
 #include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h> #define TIMEOUT 5
#define BUF_LEN 1024 int main()
{
struct timeval tv;
fd_set readfds; FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds); tv.tv_sec = TIMEOUT;
tv.tv_usec = ; ret = select (STDIN_FILENO+, &readfds, NULL,NULL,&tv); if (FD_ISSET (STDIN_FILENO, &readfds)) {
char buf[BUF_LEN+];
int len = read(STDIN_FILENO, buf, BUF_LEN); buf[len] = ;
printf("read:%s\n",buf);
}
}

poll

#include <sys/poll.h>

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

struct pollfd {
    int fd; //文件描述符

short events; //所要查看的事件

short revents; //返回所目击事件
};

每个 pllfd 结构可用于制定一个要查看的文件描述符。每个pollfd结构的 events 字段是该文件描述符所要查看事件的位掩码,用户可以设定此字段。而 revents 字段则是该文件描述符所目击事件的位掩码,内核会在返回时设定此字段。

有效事件包括:
POLLIN 有数据可供读取
OLLRDNORM 有一般数据可供读取
POLLRDBAND 有优先数据可供读取
POLLPRI 有紧急数据可供读取
POLLOUT 写入操作将不受阻塞
POLLWRNORM 写入一般数据将不受组阻塞
POLLWRBAND 写入优先数据将不受阻塞
POLLMSG 有SIGPOLL消息可用
POLLER 所指定的文件描述符发生错误
POLLHUP 所指定的文件描述符发生挂起事件
POLLNVAL 所指定的文件描述符无效

例子:

 #include <stdio.h>
#include <unistd.h>
#include <sys/poll.h> #define TIMEOUT 5 int main()
{
struct pollfd fds[];
int ret; fds[].fd = STDIN_FILENO;
fds[].events = POLLIN; fds[].fd = STDOUT_FILENO;
fds[].events = POLLOUT; int a;
//scanf("%d",&a);
ret = poll(fds,,TIMEOUT*); if (!ret) {
perror("poll");
return ;
} if (!ret) {
printf("%d seconds elapsed. \n", TIMEOUT);
return ;
} if (fds[].revents & POLLIN)
printf("stdin is readable\n"); if (fds[].revents & POLLOUT)
printf("stdout is writable\n");
scanf("%d",&a);
return ;
}

最新文章

  1. C# 属性和索引
  2. linux信号机制 - 用户堆栈和内核堆栈的变化【转】
  3. HDU 5059 Harry And Biological Teacher
  4. Models and the ServiceManager
  5. Dubbo xml配置 和注解配置 写法
  6. Javascript和jQuery WordPress 图片轮播插件, 内容滚动插件,前后切换幻灯片形式显示
  7. iOS 创建上线证书
  8. RFID射频卡超市购物结算系统
  9. python 设计模式,“多”例模式
  10. SQL server存储过程,触发器,游标相关实例
  11. ListView的setOnItemClickListener位置错乱问题
  12. docker 基础 之安装
  13. 030 分布式集群中,设定时间同步服务器,以及ntpd与ntpdate的区别
  14. C语言保证,0永远不是有效的数据地址,因此,返回址0可用来表示发生的异常事件
  15. Unity 3D中 Ulua-UGUI简单的Demo——热更新的具体流程、使用说明
  16. 内置锁(三)synchronized的几个要注意的对象监视器
  17. hmm和Veterbi算法(一)
  18. redis事务和脚本
  19. 解题:POI 2009 TAB
  20. 【BZOJ】1419 Red is good

热门文章

  1. POJ2689 Prime Distance 质数筛选
  2. oc18--self1
  3. oc15--文档安装
  4. udev详解【转】
  5. 第17章 Redis概述
  6. thinkphp 具体常量,在view里面使用
  7. 为什么用Mysql?
  8. less常用方法
  9. Arduino UNO R3
  10. 基于Linux/C++简单线程池的实现