linux脚本能轮循吗,Linux设备驱动---轮询操作poll()函数

1.轮询的概念和作用

使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被执行。

2.应用程序中的轮询编程---select()函数

select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程

int select(int maxfds, fd_set *readfds, fd_set

*writefds, fd_set

*exceptfds, struct timeval *timeout)

maxfds:文件描述符的范围,是待检测的最大文件描述符加1

readfds:被读监控的文件描述符集

writefds:被写监控的文件描述符集

exceptfds:被异常监控的文件描述符集

timeout:它可以使select()在等待timeout时间后若没有文件描述符准备好

则返回

struct timeval *timeout {

int tv_set;

int tv_uset;

}

timeout的值有如下三种情况:

0:不管是否有文件满足要求,都立即返回,无文件满足要求返回

0,有文件满足要求时返回一个正值(结构体内成员为0)

NULL:select将阻塞进程,直到某个文件满足要求(指针为空)

正整数:就是等待的最长时间,即select在timeout时间内阻塞进程

返回值:1)正常情况下返回满足要求的文件描述符的个数

2)经过了timeout时间等待后仍无文件满足要求,返回值为0

3)如果select被某个信号中断,返回-1并设置errno为EINTR

4)如果出错,返回-1并设置errno为EINTR

下列操作用来设置、清除、判断文件描述符集合:

FD_ZERO(fd_set *set) //清除一个文件描述符集:

FD_SET(int fd,fd_set *set) //将一个文件描述符加入文件描述符集中

FD_CLR(int fd,fd_set *set) //将一个文件描述符从文件描述符集中清除

FD_ISSET(int fd,fd_set *set)

//判断文件描述符是否被置位

3.设备驱动中的轮询编程---poll()函数

unsigned int (*poll)(struct

file *filp, struct poll_table *wait)

poll设备方法完成两件事:

1)对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应

的等待队列头添加到poll_table

2)返回表示是否能对设备进行无阻塞读、写访问的掩码

poll_wait()函数:用于向poll_table注册等待队列

void poll_wait(struct file

*filp, wait_queue_head_t

*queue,

poll_table

*wait)

poll_wait()函数所做的工作是把当前进程添加到wait参数指定的等待队列

(poll_table)中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值