linux复用技术:poll

本文详细介绍了Poll机制的工作原理,包括其核心数据结构pollfd及如何使用poll进行文件描述符的状态检查。同时,还探讨了在驱动程序中如何利用poll机制进行事件等待与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1
2
#include <sys/poll.h>
int poll(struct  pollfd  *fds,  nfds_t   nfds,   int   timeout);

总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再来判断是否有文件可读,如果有,返回fd的数量,如果没有,则返回0.  

1
2
3
4
5
6
sturct  pollfd
{
    int      fd;         //文件描述符
    short    events;     //等待的事件
    short    revents;    //实际发生了的事件
}
The caller should sepcify the number of the items in the fds array in nfds
合法的事件如下:
            POLLIN                                有数据可读
            POLLRDNORM                     有普通数据可读
            POLLRDBAND                      有优先数据可读
            POLLPRI                               有紧迫数据可读
            POLLOUT                              写数据不会导致阻塞
            POLLWRNORM                     写普通数据不会导致阻塞
            POLLWRBAND                      写优先数据不会导致阻塞
            POLLMSG    SIGPOLL           消息可用
            POLLERR                               指定的文件描述符发生错误
            POLLHUP                               指定的文件描述符挂起事件
            POLLNVAL                            指定的文件描述符非法

在驱动程序中

驱动程序里与poll相关的地方有两处:一是构造file_operation结构时,要定义自己的poll函数。二是通过poll_wait来调用上面说到的__pollwait函数,pollwait的代码如下:

1
2
3
4
5
staticinline void poll_wait(struct file * filp, wait_queue_head_t * wait_address,poll_table *p)
{
     if (p && wait_address)
     p->qproc(filp, wait_address, p);
}

p->qproc就是__pollwait函数,从它的代码可知,它只是把当前进程挂入我们驱动程序里定义的一个队列里而已。它的代码如下:

1
2
3
4
5
6
7
8
9
10
11
staticvoid __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *p)
{
    struct poll_table_entry *entry =poll_get_entry(p);
    if (!entry)
    return;
    get_file(filp);
    entry->filp = filp;
    entry->wait_address = wait_address;
    init_waitqueue_entry(&entry->wait,current);
    add_wait_queue(wait_address,&entry->wait);
}

执行到驱动程序的poll_wait函数时,进程并没有休眠,我们的驱动程序里实现的poll函数是不会引起休眠的。让进程进入休眠,是前面分析的do_sys_poll函数的30行“__timeout = schedule_timeout(__timeout)”。

poll_wait只是把本进程挂入某个队列,应用程序调用poll > sys_poll> do_sys_poll > poll_initwait,do_poll > do_pollfd > 我们自己写的poll函数后,再调用schedule_timeout进入休眠。如果我们的驱动程序发现情况就绪,可以把这个队列上挂着的进程唤醒。可见,poll_wait的作用,只是为了让驱动程序能找到要唤醒的进程。即使不用poll_wait,我们的程序也有机会被唤醒:chedule_timeout(__timeout),只是休眠__time_out这段时间。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值