Linux中的poll机制

Linux中,如果想要采用中断程序,则需要修改驱动, 方便起见,使用select/poll机制进行相应

selectpoll在使用时,都会自动挂起当前进程,当响应条件达成时,根据返回值来判断是哪一种响应,作出相应的操作。

 

int select (int n, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, struct timeval *timeout);

select可以监视三种文件描述符,分别为writefdsreadfdsexceptfds,还有一种是超时。当select返回是,通过遍历这几种文件描述符(或超时),来判断是哪种响应,并进行相关操作

 

int poll (struct pollfd *fds, unsigned int nfds, inttimeout);

poll可以监视的有很多种,并且一样也有超时操作,与select相似

关于poll监视的文件描述符宏定义如下:

 

#define POLLIN 0x0001      //普通或优先级带数据可读

#define POLLPRI 0x0002    //高优先级数据可读

#define POLLOUT 0x0004  //普通数据可写

#define POLLERR 0x0008  //发生错误

#define POLLHUP 0x0010  //发生挂起

#define POLLNVAL 0x0020  //描述字不是一个打开的文件

  

#define POLLRDNORM 0x0040  //普通数据可读

#define POLLRDBAND 0x0080  //优先级带数据可读

#define POLLWRNORM 0x0100  //普通数据可写

#define POLLWRBAND 0x0200  //优先级带数据可写

#define POLLMSG 0x0400     //消息可用

 

关于poll的部分例程如下:

 

    intfd;

 

    if((fd=open_port(fd,3))<0){

        printf("open_port error");

        return;

    }

 

    if((i=set_opt(fd,9600,8,'N',1))<0){

        printf("set_opt error");

        return;

    }

 

    int nread = 0;

    int ret;

    struct pollfd event;

   

    char readBuf[10];

    memset(readBuf, 0, 10);

 

    memset(&event,0,sizeof(event));

    event.fd = fd;

    event.events = POLLIN;

    ret=poll((struct pollfd *)&event,1,50);

 

    if(ret<0){

        printf("poll error!\n");

        exit(1);

    }

    if(ret==0){

        printf("Time out!\n");

    }

    if(event.revents&POLLERR){

        printf("Device error!\n");

        exit(1);

    }

    if(event.revents&POLLIN){

        nread = read(fd,readBuf,10);

        printf("nread =%d,%s\n",nread,readBuf);

    }

 

在执行ret=poll((structpollfd *)&event,1,50);这句之后,这个进程会自动挂起,直到POLLIN被触发,或者超时50ms之后,运行接下来的语句

### 回答1: poll机制Linux驱动一种用于实现I/O多路复用的机制。在使用poll机制时,驱动程序可以在多个文件描述符上同时等待可读、可写或异常事件的发生,从而避免了在相应的文件描述符上使用阻塞IO时CPU周期的浪费。poll机制的主要思路是向内核注册多个文件描述符,内核会将这些文件描述符上的I/O事件传递给用户程序,用户程序能够根据得到的事件类型继续执行下去。 ### 回答2: poll机制Linux驱动程序实现异步输入输出操作的一种方法,通过这种机制,驱动程序可以将不同的设备进行组合,从而实现对这些设备进行统一的轮询操作。 在使用poll机制时,驱动程序需要提供一个poll方法,在该方法,通过向用户空间返回一个特殊的文件描述符来表示设备状态的变化,然后用户空间通过读取这个描述符来判断设备是否有数据到达。如果有数据到达,用户空间再调用相应的读取方法来读取这些数据,从而实现异步读写。 在实现poll机制时,驱动程序通常需要调用内核提供的一些API接口,如file_operations结构体poll方法、wait_queue_head_t结构体、poll_table结构体等。 在使用poll机制时,用户空间可以通过调用poll函数来注册设备文件,并设置等待事件。当设备的状态改变时,内核会将读取操作挂起,并返回一个特殊的文件描述符。此时,用户空间可以通过调用相应的读取函数来读取数据,在读取完毕后,再次通过poll函数注册设备文件,等待下一次事件处理。 总之,poll机制可以帮助驱动程序实现异步输入输出操作,同时也可以帮助应用程序进行事件处理,提高了Linux的应用程序的可靠性和效率。 ### 回答3: poll机制Linux内核提供的多路复用机制之一,它使得一个进程可以监视多个文件描述符上的读写情况。在进程需要同时监听多个文件描述符的读写情况时,若采用传统的阻塞式I/O方式,就需要使用多个线程或进程来处理,这种方式会导致系统资源的浪费。因此,poll机制的使用,避免了上述情况发生。 poll机制最常用于网络编程。在一个服务器程序,可能需要同时监听多个客户端的连接请求。使用poll机制可以将这些客户端的连接描述符放入一个pollfd数组,同时对这个数组进行监听,以便及时处理。 poll的基本原理是:进程调用poll系统调用时,内核会挂起该进程,直到poll所监听的文件描述符有读写事件发生时,内核会唤醒进程,通过返回值告知进程哪些文件描述符发生了事件,并将该事件信息写入对应的pollfd结构体。这样,进程就可以根据返回的信息对文件描述符进行相应的操作。 poll机制存在以下优点: 1.单个进程可以同时监视多个文件描述符的读写情况,可以更好的利用CPU资源。 2.和select相比,poll没有描述符数量限制,select有FD_SETSIZE的限制。 3.poll在内核将打开文件描述符的等待队列挂起,直到设备就绪,因此在多处理器系统poll的性能要优于select。 4.使用poll不需要重新初始化文件描述符,不需要进行文件描述符拷贝操作。这使得poll的使用比较方便。 总之,poll机制Linux系统非常重要的一个多路复用机制,它极大地提高了系统的效率和可用性。在进行网络编程时,我们常常需要使用poll机制来提高代码的性能和实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值