I/O复用----poll
2018-08-01 (星期三)
poll():
#include <sys/poll.h>
int poll (struct pollfd *fd, unsigned int nfds, int timeout);
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 所要查看的事件 */
short revents; /* 返回所目击的事件 */
};
每个pollfd结构可用于指定一个要查看的文件描述符.
events字段:该文件描述符所要查看事件的位掩码.
(位掩码是什么?)
revents字段:该文件描述符所目击事件的位掩码,内核会在返回时设置此字段.events字段中所要求的事件可能会从revents字段返回.有效事件:
POLLIN 有数据可供读取
POLLRDNORM 有一般数据可供读取
POLLRDBAND 有优先数据可供读取
POLLPRI 有紧急数据可供读取
POLLOUT 写入操作将不受阻挡
POLLWRNORM 写入一般数据将不受阻挡
POLLWRBAND 写入优先数据将不受到阻挡
POLLMSG 有SIGPOLL消息可用
此外,revents字段可能会返回下列事件:
POLLER 所指定的文件描述符发生错误
POLLHUP 所指定的文件描述符发生过去事件
POLLNVAL 所指定的文件描述符无效
POLLIN | POLLPRI(有数据,有紧急数据可供读取)等效于select()的读取事件
POLLOUT | POLLWRBAND(有数据,有紧急数据可供写入)等效于select()的写入事件.
POLLIN(有数据可供读取) 等效于 POLLRDNORM | POLLRDBAND(有一半数据或优先数据可供读取)
POLLOUT(写入操作不受阻挡) 等效于POLLWRNORM(写入一般数据不受阻挡)
timeout参数用来指定等不到就绪IO也要返回的事件.若值为-1,表示无限等待.
返回值与错误代码
执行成功时,poll()会返回有目击事件的文件描述符(也就是其结构具有非零的revents字段)的数目;如果在有任何事件在发生之前此调用因逾时而返回,则会返回0,整形失败会返回-1,并将errno设定为下面的其中一个值.
EBADF 在一个过多个结构中指定了无效的文件描述符
EFAULT 指向fds的指针指向了进程地址空间以外的地方
EINVAL nfds参数设定超过了RLIMIT_NOFILE的限制
ENOMEM内存怒不足以完成这项要求
#include <stdio.h>
#include <unistd.h>
#include <sys/poll.h> #define TIMEOUT 5 /* poll 的等待时间,以秒为单位 */ int main(void) {
struct pollfd fds[];
int ret; /* 查看stdin的输入 */
fds[].fd = STDIN_FILENO;
fds[].events = POLLIN; /* 查看stdout是否可供写入(通常可以) */
fds[].fd = STDOUT_FILENO;
fds[].events = POLLOUT; /* 都设定好了,开始提供服务! */
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");
}
return ;
}
I/O复用----poll的更多相关文章
- IO复用——poll系统调用
1.poll函数 #include<poll.h> int poll(struct pollfd* fds, nfds_t ndfs, int timeout) poll函数在一定的时间内 ...
- I/O复用 poll简介
1.基本概念 poll起源于SVR3,开始时局限于流设备,在SVR4时取消了此限制,允许poll工作在任何描述符上,但涉及到流设备时,它还提供了附加信息. poll的机制与select类似,与sele ...
- 高级IO复用应用:聊天室程序
简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户.这里采用IO复用poll技术.客户端采用了splice零拷贝.服务端采用了空间换时间(分配超大的用户数 ...
- 网络编程-I/O复用
I/O模型 Unix下可用的I/O模型有五种: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll.epoll) 信号驱动式I/O(SIGIO) 异步I/O(POSIX的aio_系列函数 ...
- 关于OPEN_MAX宏undeclared的问题
最近在看unp时,I/O复用-poll一章的代码使用到了OPEN_MAX.据书中描述,这一宏定义在limits.h头文件中,指代一个进程在任意时刻能打开的最大描述符数目.但在代码编译时遇到了错误,提示 ...
- select、poll、epoll三组IO复用
int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...
- I/O复用中的 select poll 和 epoll
I/O复用中的 select poll 和 epoll: 这里有一些不错的资料: I/O多路复用技术之select模型: http://blog.csdn.net/nk_test/article/de ...
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...
- UNIX网络编程——I/O复用:select和poll函数
我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死.服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然 ...
随机推荐
- SVN的使用——下载、安装
今天我们来学习一下如何使用SVN(Subversion) 既然要使用SVN那么我们就先来认识一下SVN.SVN的全名是Subversion,它是一个自由,开源的版本控制系统.在Subversion管理 ...
- Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转
Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...
- Java:xxx is not an enclosing class
1. 错误原因 该错误一般出现在对内部类进行实例化时,例如 public class A{ public class B{ } } 此时B是A的内部类,如果我们要使用如下语句实例化一个B类的对象: A ...
- Hive实现自增列
1.用row_number()函数生成代理键 ) max_id from id_test) t2; 2.用UDFRowSequence生成代理键 ——报错? add jar ...
- c# enum 解析
解析定义的枚举 public enum OrderPaymentStatus { /// <summary> /// 未支付 /// </summary> [Descripti ...
- uvaoj455Periodic Strings(枚举)
A character string is said to have period k if it can be formed by concatenating one or more repetit ...
- ReadyAPI创建功能测试的方法
声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能测试,本篇将分步操作创建功能测试. 1.从So ...
- Android Studio怎样创建App项目
然后等待大约N分钟: 默认的是Android模式, 改为Project模式更符合我们的习惯:
- selenium,unittest——两个class连续运行
将多个class放在一个文件内一起运行,这是一个多用例不同网站进行测试的方法 #encoding=utf-8from selenium import webdriverimport time,unit ...
- lintcode407 加一
加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1,2,3] ...