Linux下I/O复用 Select与Poll
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux下I/O复用 Select与Poll,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2849字,纯文字阅读大概需要5分钟。
内容图文
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); //测试特定文件描述符是否已就绪
1 #include <stdio.h> 2 #include <sys/time.h> 3 #include <sys/types.h> 4 #include <unistd.h> 5 6#define TIMEOUT 5 7#define BUF_LEN 1024 8 9int main() 10{ 11struct timeval tv; 12 fd_set readfds; 1314 FD_ZERO(&readfds); 15 FD_SET(STDIN_FILENO, &readfds); 1617 tv.tv_sec = TIMEOUT; 18 tv.tv_usec = 0; 1920 ret = select (STDIN_FILENO+1, &readfds, NULL,NULL,&tv); 2122if (FD_ISSET (STDIN_FILENO, &readfds)) { 23char buf[BUF_LEN+1]; 24int len = read(STDIN_FILENO, buf, BUF_LEN); 2526 buf[len] = 0; 27 printf("read:%s\n",buf); 28 } 29 }
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 所指定的文件描述符无效
例子:
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/poll.h> 4 5#define TIMEOUT 5 6 7int main() 8{ 9struct pollfd fds[2]; 10int ret; 1112 fds[0].fd = STDIN_FILENO; 13 fds[0].events = POLLIN; 1415 fds[1].fd = STDOUT_FILENO; 16 fds[1].events = POLLOUT; 1718int a; 19//scanf("%d",&a);20 ret = poll(fds,2,TIMEOUT*1000); 2122if (!ret) { 23 perror("poll"); 24return1; 25 } 2627if (!ret) { 28 printf("%d seconds elapsed. \n", TIMEOUT); 29return0; 30 } 3132if (fds[0].revents & POLLIN) 33 printf("stdin is readable\n"); 3435if (fds[1].revents & POLLOUT) 36 printf("stdout is writable\n"); 37 scanf("%d",&a); 38return0; 39 }
原文:http://www.cnblogs.com/nicganon/p/3761789.html
内容总结
以上是互联网集市为您收集整理的Linux下I/O复用 Select与Poll全部内容,希望文章能够帮你解决Linux下I/O复用 Select与Poll所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。