poll函数

poll函数作为Linux系统中的一种I/O多路复用技术,类似于select,但它们在使用上有区别。poll不会修改传入的events参数,而是通过revents返回发生的事件。它可以测试文件描述符的可读性、可写性和异常条件。根据timeout参数,poll可以实现永久等待、立即返回或等待指定时间后返回,对单个描述符的阻塞不影响整个函数的阻塞状态。

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

poll函数类似与select函数,但其调用形式不同。

int poll(struct pollfd fdarray[],unsigned long nfds,int timeout);

与select不同,poll并不为每个条件构造一个描述符集,而是构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其关心的条件。

第一个参数:

struct pollfd{
    int fd;
    short events;
    short revents;
};

fd:所要检查的描述符,<0则表示忽略。

events:在fd描述符上所关心的事件。

revents:描述符fd上发生的事件。


events成员可以设置为下图所示值的一个或几个,通过这些值可以告诉内核我们对该描述符关心的是什么。返回时,内核设置revents成员,说明该描述符发生了什么事件。

注意poll函数没有修改events成员,而select则修改了其参数,以指示哪个描述符已准备好



前四行测试可读性、中三行测试可写性、后三行测试异常条件(内核在函数返回时设置的)。

一个描述符被挂起POLLHUP后,则不可再写向该描述符,但仍可从中读数据。


poll函数的最后一个从参数timeout可以指定我们等待多长时间。同select有三种情况:

timeout==INFTIM  表示永久等待,INFTIM通常等于-1,当描述符已准备好或捕捉到一个信号则返回。捕捉到信号poll返回-1,errorno设置为EINTR。

timeout==0 表示不等待,测试所有描述符并立即返回,这是得到很多描述符的状态而不阻塞poll函数的轮询方法。

timeout>0 表示等待timeout毫秒,当指定的描述符以准备好或者时间超时立即返回。如果超时又没有一个描述符准备好,返回0.

与select函数一样,一个描述符的阻塞不影响poll是否阻塞。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值