2018-08-01 (星期三)
poll():

  1. #include <sys/poll.h>
  2.  
  3. int poll (struct pollfd *fd, unsigned int nfds, int timeout);
  4.  
  5. struct pollfd {
  6. int fd; /* 文件描述符 */
  7. short events; /* 所要查看的事件 */
  8. short revents; /* 返回所目击的事件 */
  9. };

每个pollfd结构可用于指定一个要查看的文件描述符.
events字段:该文件描述符所要查看事件的位掩码.
(位掩码是什么?)
revents字段:该文件描述符所目击事件的位掩码,内核会在返回时设置此字段.events字段中所要求的事件可能会从revents字段返回.有效事件:

  1. POLLIN 有数据可供读取
  2. POLLRDNORM 有一般数据可供读取
  3. POLLRDBAND 有优先数据可供读取
  4. POLLPRI 有紧急数据可供读取
  5. POLLOUT 写入操作将不受阻挡
  6. POLLWRNORM 写入一般数据将不受阻挡
  7. POLLWRBAND 写入优先数据将不受到阻挡
  8. POLLMSG SIGPOLL消息可用

此外,revents字段可能会返回下列事件:

  1. POLLER 所指定的文件描述符发生错误
  2. POLLHUP 所指定的文件描述符发生过去事件
  3. POLLNVAL 所指定的文件描述符无效

POLLIN | POLLPRI(有数据,有紧急数据可供读取)等效于select()的读取事件
POLLOUT | POLLWRBAND(有数据,有紧急数据可供写入)等效于select()的写入事件.
POLLIN(有数据可供读取) 等效于 POLLRDNORM | POLLRDBAND(有一半数据或优先数据可供读取)
POLLOUT(写入操作不受阻挡) 等效于POLLWRNORM(写入一般数据不受阻挡)
timeout参数用来指定等不到就绪IO也要返回的事件.若值为-1,表示无限等待.

返回值与错误代码
执行成功时,poll()会返回有目击事件的文件描述符(也就是其结构具有非零的revents字段)的数目;如果在有任何事件在发生之前此调用因逾时而返回,则会返回0,整形失败会返回-1,并将errno设定为下面的其中一个值.

  1. EBADF 在一个过多个结构中指定了无效的文件描述符
  2. EFAULT 指向fds的指针指向了进程地址空间以外的地方
  3. EINVAL nfds参数设定超过了RLIMIT_NOFILE的限制
  4. ENOMEM内存怒不足以完成这项要求
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/poll.h>
  4.  
  5. #define TIMEOUT 5 /* poll 的等待时间,以秒为单位 */
  6.  
  7. int main(void) {
  8. struct pollfd fds[];
  9. int ret;
  10.  
  11. /* 查看stdin的输入 */
  12. fds[].fd = STDIN_FILENO;
  13. fds[].events = POLLIN;
  14.  
  15. /* 查看stdout是否可供写入(通常可以) */
  16. fds[].fd = STDOUT_FILENO;
  17. fds[].events = POLLOUT;
  18.  
  19. /* 都设定好了,开始提供服务! */
  20. ret = poll (fds, , TIMEOUT * );
  21. if (ret == -) {
  22. perror ("poll");
  23. return ;
  24. }
  25.  
  26. if (!ret) {
  27. printf ("%d seconds elapsed.\n", TIMEOUT);
  28. return ;
  29. }
  30.  
  31. if (fds[].revents & POLLIN) {
  32. printf ("stdin is readable\n");
  33. }
  34.  
  35. if (fds[].revents & POLLOUT) {
  36. printf("stdout is writable\n");
  37. }
  38. return ;
  39. }

I/O复用----poll的更多相关文章

  1. IO复用——poll系统调用

    1.poll函数 #include<poll.h> int poll(struct pollfd* fds, nfds_t ndfs, int timeout) poll函数在一定的时间内 ...

  2. I/O复用 poll简介

    1.基本概念 poll起源于SVR3,开始时局限于流设备,在SVR4时取消了此限制,允许poll工作在任何描述符上,但涉及到流设备时,它还提供了附加信息. poll的机制与select类似,与sele ...

  3. 高级IO复用应用:聊天室程序

    简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户.这里采用IO复用poll技术.客户端采用了splice零拷贝.服务端采用了空间换时间(分配超大的用户数 ...

  4. 网络编程-I/O复用

    I/O模型 Unix下可用的I/O模型有五种: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll.epoll) 信号驱动式I/O(SIGIO) 异步I/O(POSIX的aio_系列函数 ...

  5. 关于OPEN_MAX宏undeclared的问题

    最近在看unp时,I/O复用-poll一章的代码使用到了OPEN_MAX.据书中描述,这一宏定义在limits.h头文件中,指代一个进程在任意时刻能打开的最大描述符数目.但在代码编译时遇到了错误,提示 ...

  6. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

  7. I/O复用中的 select poll 和 epoll

    I/O复用中的 select poll 和 epoll: 这里有一些不错的资料: I/O多路复用技术之select模型: http://blog.csdn.net/nk_test/article/de ...

  8. 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

    本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...

  9. UNIX网络编程——I/O复用:select和poll函数

    我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死.服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然 ...

随机推荐

  1. 安卓app连接CC2541-手机休眠后唤醒,通信不再成功

    1. 现在遇到的问题,手机进入休眠状态后唤醒,APP软件和CC2541的通信不正常了,但是CC2541依然检测到时连接状态.如何解决这个问题?手机唤醒之后会重新创建活动? 2.Wakelock 锁机制 ...

  2. CC2541工程优化等级的问题

    1. 调试工程的时候发现,优化等级稍微调高一级,就容易出问题,只能用None,其他等级会出现数据丢失的现象.

  3. 华为LiteOS系统使用-任务调度函数-第一篇

    1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...

  4. Java: Replace a string from multiple replaced strings to multiple substitutes

    Provide helper methods to replace a string from multiple replaced strings to multiple substitutes im ...

  5. hdu2509Be the Winner(反nim博弈)

    Be the Winner Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. 397. Longest Continuous Increasing Subsequence

    Description Give an integer array,find the longest increasing continuous subsequence in this array. ...

  7. Centos7下部署activeMQ消息队列服务

    #1.下载activeMQlinux包 http://activemq.apache.org/activemq-5100-release.html   下载linux的activeMQ包 #2.使用X ...

  8. Ubuntu—安装并运行sublime

    step1 到官网看看 https://www.sublimetext.com/3 step2 根据版本选择,我的是32位的 step3 ubuntu终端安装 (1)切换目录 -$ cd /opt  ...

  9. 【C#】ArcFace2 视频人脸比对教程

    请允许我大言不惭,叫做教程,特希望各位能指正.哦,我用的是vs2017.了解更多详情可以访问虹软人工智能开放平台 一.准备工作 1.创建项目 2.添加EMGU.CV包 ,并设属性“复制到输出目录”为“ ...

  10. SpringBoot在IntelliJ IDEA下for MAC 热加载

    说在前面 热加载:文件内容变更服务器自动运行最新代码.实则在IDEA环境进行热部署后,下述过程一气呵成. 1代码变更,文件自动保存(IDEA自动保存代码,用户无需使用COMMAND+SAVE快捷键): ...