linux poll

man poll:

NAME
poll, ppoll - wait for some event on a file descriptor

SYNOPSIS
#include <poll.h>

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

#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <poll.h>

int ppoll(struct pollfd *fds, nfds_t nfds,
const struct timespec *timeout_ts, const sigset_t *sigmask);

DESCRIPTION
poll() performs a similar task to select(2): it waits for one of a set of file descriptors to become ready to per‐
form I/O.

The set of file descriptors to be monitored is specified in the fds argument, which is an array of structures of the
following form:

struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};

要测试的条件由events指定,函数在相应的revents成员中返回该描述字的状态。(每个描述字都有两个变量,一个为调用值,另一个为返回结果,从而避免使用值结果参数。)

结果数组中元素的个数由nfds参数指定。

返回值:当发生错误时,poll函数的返回值为-1,若定时器时间到之前没有任何描述字就绪,则返回0.否则返回就绪描述字的个数,即其revents成员值非0的描述字个数。

如果我们不再关心某个特定描述字,那么可以把与它对应的pollfd结构的fd成员设置为一个负值。poll函数将忽略这样的pollfd结构的events成员,返回时将它的revents成员的值置为0.

  020.#ifndef INFTIM     /*按照书上解释:POSIX规范要求INFTIM在头文件<poll.h>中定义,不过*/

  021.#define INFTIM -1  /*许多系统仍然把它定义在头文件<sys/stropts.h>中,但是经过我的测试*/

  022.#endif             /*即使都包含这两个文件,编译器也找不到,不知何解。索性自己定义了。*/

#include"unp.h"
#include<limits.h>//for open_MAX,ubuntu?бû?
#define OPEN_MAX 1024
#define INFTIM -1

int main(int argc,char **argv)
{
    int i ,maxi,listenfd,connfd,sockfd;
    int nready;
    ssize_t n;

    socklen_t clilen;
    char buf[MAXLINE];

    struct pollfd client[OPEN_MAX];
    struct sockaddr_in cliaddr,servaddr;
    listenfd=Socket(AF_INET,SOCK_STREAM,0);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(8001);
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

    Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
    Listen(listenfd,LISTENQ);

    client[0].fd=listenfd;
    client[0].events=POLLRDNORM;
    for(i=1;i<OPEN_MAX;i++)
        client[i].fd=-1;//
    maxi=0;

    for(;;)
    {
        nready=poll(client,maxi+1,INFTIM);
        if(client[0].revents  & POLLRDNORM )
        { //new client connction
            clilen=sizeof(cliaddr);
            connfd=Accept(listenfd,(SA*)&cliaddr,&clilen);

            for(i=1;i<OPEN_MAX;i++)
            {
                if(client[i].fd<0)
                {
                    client[i].fd=connfd;//save desc
                    break;
                }
            }
            if(i==OPEN_MAX)
                err_quit("too many client");
            client[i].events=POLLRDNORM;
            if(i>maxi)
                maxi=i;
            if(--nready<=0)
                continue;
        }
        for(i=1;i<=maxi;i++)
        {
            //check all clients for data
            if( (sockfd=client[i].fd)<0)
                continue;
            if(client[i].revents & ( POLLRDNORM | POLLERR))
            {
                if((n=read(sockfd,buf,MAXLINE))<0)
                {
                    if(errno==ECONNRESET)
                    {
                        //conncetion reset by client
                        Close(sockfd);
                        client[i].fd=-1;
                    }
                    else
                        err_sys("read error");
                }
                else if(n==0)
                {
                    //connection close by client
                    Close(sockfd);
                    client[i].fd=-1;
                }
                else    Writen(sockfd,buf,n);

               if(--nready<=0)
                    break;
            }
        }
    }
}

http://itlab.idcquan.com/linux/c/816050.html

时间: 2024-10-17 10:29:30

linux poll的相关文章

linux poll机制使用(一)

一.poll机制的作用 1.poll机制的作用 在前面的使用中断的的方式来读取按键值(linux 中断管理(四)).使用这种方式读取按键,如果按键没有按下的时候,应用程序会一直处于睡眠的状态.如果想要即使按键没有按下,在一定的时间后也能返回,要实现这种功能,可以使用poll机制.(select IO复用和epoll也可以实现这种功能,这里只写poll机制) 二.poll机制的应用编程 1.应用层函数接口 1).API: int poll(struct pollfd *fds, nfds_t nf

linux poll机制分析(二)

一.回顾 在linux poll机制使用(一)写了个实现poll机制的简单例子.在驱动模块中需要实现struct file_operations的.poll成员.在驱动模块中xxx_poll函数的的作用是将当前进程添加到等待队列中:然后判断事件是否发生,发生则返回POLLIN | POLLRDNORM,否则返回0(可以看看上一章的例子):接下来分析一下 linux 内核中 poll 机制的实现. 二.poll机制分析 1.系统调用 当应用层调用poll函数时,linux发生系统调用(系统调用入口

linux poll函数

poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeout); struct pollfd的结构如下: struct pollfd{ int fd: // 文件描述符 short event:// 请求的事件 short revent:// 返回的事件 } 每个pollfd结构体指定了一个被监视的文件描述符.第一个参数是一个数组,即poll函数可以监视多个文件描

Linux poll机制

所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的内核函数为:sys_open.sys_read.sys_write.sys_poll. 一.内核框架:对于系统调用poll或select,它们对应的内核函数都是sys_poll.分析sys_poll,即可理解poll机制.1.sys_poll函数位于fs/select.c文件中,代码如下:asmlinkage long sys_poll(stru

linux poll 学习

一.poll介绍 二.poll使用 三.参考 http://www.360doc.com/content/12/0821/10/7775902_231465100.shtml http://blog.chinaunix.net/uid-23842323-id-2656589.html

Linux下select&amp;poll&amp;epoll的实现原理(一)

最近简单看了一把Linux linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现.此处做一些记录.其基本的原理是相同的,流程如下 先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪 如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束 如果暂时没有IO事件就绪,则根据所给定的超时参数,选择性地进入等待 如果超时参数指示不等待,则

Linux高级字符设备之Poll操作

在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问息息相关的,使用非阻塞I/O的应用程序通常会使用select和poll系统调用查询是否可对设备进行无阻塞的访问.select系统调用最终会引发设备驱动中的poll函数被执行. 一.select()系统调用: 用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. 1.select()原型: int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set 

linux设备驱动归纳总结(三):6.poll和sellct【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 接下来会讲系统调用select在驱动中的实现,如果对系统调用select不太懂的话,建议先看书补习一下. xxxxxxxxxxxxxxxxxxxx

linux驱动程序中的poll机制编程

#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <asm/irq.h> #include <linux/interrupt.h> #include <asm/uaccess.h> #include