poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。

#include <poll.h>

int poll(struct pollfd fd[], nfds_t nfds, int timeout);

参数:

1)第一个参数:一个结构数组,struct pollfd结构如下:

  struct pollfd{

  int fd;              //文件描述符

  short events;    //请求的事件

  short revents;   //返回的事件

  };

  events和revents是通过对代表各种事件的标志进行逻辑或运算构建而成的。events包括要监视的事件,poll用已经发生的事件填充revents。poll函数通过在revents中设置标志肌肤POLLHUP、POLLERR和POLLNVAL来反映相关条件的存在。不需要在events中对于这些标志符相关的比特位进行设置。如果fd小于0, 则events字段被忽略,而revents被置为0.标准中没有说明如何处理文件结束。文件结束可以通过revents的标识符POLLHUN或返回0字节的常规读操作来传达。即使POLLIN或POLLRDNORM指出还有数据要读,POLLHUP也可能会被设置。因此,应该在错误检验之前处理正常的读操作。

poll函数的事件标志符值

常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件

注意:后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。

2)第二个参数nfds:要监视的描述符的数目。

3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待的时间。如果  它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。

timeout值 说明
INFTIM 永远等待
0 立即返回,不阻塞进程
>0 等待指定数目的毫秒数

例子程序:

在/root/pro/fd1 /root/pro/fd2中分别有内容,

1234

5678

1122

3344

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <stropts.h>
#include <sys/poll.h>
#include <sys/stropts.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>

#define BUFSIZE 1024

int main(int argc, char *argv[])
{
    char buf[BUFSIZE];
    int bytes;
    struct pollfd *pollfd;
    int i=0;
    int nummonitor=0;
    int numready;
    int errno;
    char *str;
    if(argc != 3)
    {
        fprintf(stderr,"Usage:the argc num error\n");
        exit(1);
    }

if((pollfd = (struct pollfd*)calloc(2, sizeof(struct pollfd))) == NULL) //为struct pollfd分配空间
           exit(1);
         for(i; i<2; i++) //初始化化struct pollfd结构
    {
        str = (char*)malloc(14*sizeof(char));        
        memcpy(str,"/root/pro/",14);
        strcat(str,argv[i+1]);//注意,需要把路劲信息放到str中,否则opne("/root/pro/argv[i]",O_RDONLY)会出错
        printf("str=%s\n",str);//原因在于,在” “之中的argv[i]是字符串,不会用变量代替argv[i].
        (pollfd+i)->fd = open(str,O_RDONLY);
        if((pollfd+i)->fd >= 0)
        fprintf(stderr, "open (pollfd+%d)->fd:%s\n", i, argv[i+1]);
        nummonitor++;
        (pollfd+i)->events = POLLIN;
    }
    printf("nummonitor=%d\n",nummonitor);
      
    while(nummonitor > 0)
    {
        numready = poll(pollfd, 2, -1);
        if ((numready == -1) && (errno == EINTR))
            continue;        //被信号中断,继续等待
        else if (numready == -1)
            break; //poll真正错误,推出
        printf("numready=%d\n",numready);
        for (i=0;nummonitor>0 && numready>0; i++)
        {
            if((pollfd+i)->revents & POLLIN)
            {
                
                 bytes = read(pollfd[i].fd, buf, BUFSIZE);
                numready--;
                printf("pollfd[%d]->fd read buf:\n%s \n", i, buf);
                nummonitor--;
            }
        }
    }
    for(i=0; i<nummonitor; i++)
        close(pollfd[i].fd);
    free(pollfd);
    return 0;
}

输出结果:

Linux Socket poll相关推荐

  1. linux socket高性能服务器处理框架

    这个博客很多东西 http://blog.csdn.net/luozhonghua2014/article/details/37041765 思考一种高性能的服务器处理框架 1.首先需要一个内存池,目 ...

  2. Linux Socket详解 大全 基础知识

    1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...

  3. Linux之poll/select/epoll代码示例

    Linux poll and epoll poll 问题:假如应用需要根据IO的状态来读或写多个IO,如何处理?如果是一个进程处理,一个一个IO的处理,那么就势必会出现阻塞等待某个IO的过程,此时就可 ...

  4. LINUX下poll函数用法

    LINUX下poll函数用法 文章目录 LINUX下poll函数用法 一.函数介绍 二.使用 1. 一.函数介绍 int poll(struct pollfd *fds, nfds_t nfds, i ...

  5. About AF_NETLINK in Linux Socket

    About AF_NETLINK in Linux Socket 由于开发和维护内核的复杂性,只把最为关键同时对性能要求最高的代码放进内核中.其他的诸如GUI,管理和控制代码,通常放在用户空间运行.这 ...

  6. Linux Socket基础介绍

    Linux Socket函数库是从Berkeley大学开发的BSD UNIX系统中移植过来的.BSD Socket接口是众多Unix系统中被广泛支持的TCP/IP通信接口,Linux下的Socket程 ...

  7. python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系

    python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...

  8. linux socket关闭连接 shutdown与close

    在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义 #include<sys/socket.h>int shutdown(i ...

  9. Linux socket关闭连接shutdown与close

    在Linux socket关闭连接的方法有两种分别是shutdown和close,首先看一下shutdown的定义 #include<sys/socket.h> int shutdown( ...

最新文章

  1. AI、5G、小程序、AIoT纷纷迎来高峰,下一步开发者们要怎么办?
  2. JavaScript this 关键词
  3. input 的id 和name什么区别
  4. 【转】LDA数学八卦
  5. 互联网日报 | 北斗三号全球卫星导航系统正式开通;拼多多上线首届“真香节”;海尔电器私有化草案出炉...
  6. 性能优化(7):教你正确使用css选择器
  7. SpringBoot项目中获取yml文件的属性时实体属性类出现Spring Boot Configuration Annotation Processor not found in classpath
  8. android 常用adb 及linux 命令
  9. 《Effective C#》读书笔记(4)
  10. 各种注册序列号 用户名
  11. 按键精灵手机助手学习过程中的教程集锦收藏
  12. C Sharp编写缓和曲线计算应用程序
  13. bcd 初始化库系统卷失败_中级|软考题库每日一练|2.24
  14. 转载:js技巧收集(200多个)
  15. iphone ipad等苹果设备30针数据线接口定义,大家可能有用
  16. [AD资料] AD入门之AD10软件安装
  17. 海淀区第九届单片机竞赛获奖名单_第九届蓝桥杯国赛电子类单片机设计与开发组获奖名单...
  18. 十诫诗串词_持续交付的十诫
  19. Win10使用CH340 USB-SERIAL串口
  20. MicroNet实战:使用MicroNet实现图像分类(二)

热门文章

  1. 29岁学python的建议_学习Python的建议
  2. ZED ROS包发布topic介绍
  3. 经济学家忽悠老百姓的“万能公式”
  4. Lightroom 如何安装lrplugin格式插件
  5. kk6.0 服务器信息 端口,KK的服务器改了端口以后 为什么我进不去
  6. 1.8 编程基础之多维数组 11 图像旋转 4分 python
  7. 【ES6(2015)】Map
  8. 红外探头_问题3: 关于在线近红外光谱仪的探头
  9. Redis工作笔记-Jedis的基本使用
  10. Qt工作笔记-QGraphicsProxyWidget放自定义界面实现拖动