参数指定的等待列表_ຕb
中。下面我们给的驱动添加个ฐ函数:
_r,_bຘ
{
0่;
_,&,;๙
数据是否可获得?
!0่
{
||rr;标示数据可获得
}
rr;
}
需要说明的是,_ຕ函数并不阻塞,程序中ณ_,ไ&,这句话的意
思并不是说直等待信号量可获得,真正的阻塞动作是上层的函数中ณ完成的。
会在个循环中对每个需要监听的设备调用它们自己้的支持函数以使得当前
进程被加入各个设备的等待列表。若当前没有任何被监听的设备就绪,则内核进行调度调
用让出进入阻塞状态,返回时将再次循环检测是否有操作可以进行,
如此反复;否则,若有任意个ฐ设备就绪,都立即返回。
我们编写个用户态应用程序来测试改写后的驱动。程序中要用到b中引入的
函数,其原型为:
,_r,_r,_ຕ,r
;
其中rr分别是被监视的读写和异常处理的文件描述
符集合,的值是需要检查的号码最高的文件描述符加1้。参数是个指向r
类型的指针,它可以使在等待时间后若没有文件描述符准备好则ท返回。
2๐3
r数据结构为:
r
{
_;๙
_;๙r
};
除此之外,我们还将使用下列:
_ຕr_――清除个文件描述符集;
_,ไ_――将个文件描述符加入文件描述符集中;
_r,_ຕ――将个ฐ文件描述符从文件描述符集中清除;
_,ไ_――判ศ断文件描述符是否被置位。
下面的用户态测试程序等待可读,但是设置了5秒的等待超时,若超过5
秒仍然没有数据可读,则输出“5”:
{
,;๙
_r;
r;
"ิ",_rr,ไ_rr|_r;
!ำ1
{
1
{
查看是否有输入
_r&r;๙
_,&r;
设置超时时间为ฦ5
_5;
_0;
+ใ1,ไ&r,,ไ,&;
数据是否可获得?
_,&r
{
r,&,;
24
r"",;
输入为0่,退出
0
{
;
}
}
r"5";
}
}
{
r"ิr"ิ;
}
}
开两个终端,分别运行程序:个对进行写,个用上述程序对进
行读。当我们在写终端给输入个ฐ值后,读终端立即就能输出该值,当我们连续5
秒没有输入时,“5”在读终端被输出,如下图:
2๐5
6设备驱动中的异步通知
结合阻塞与非阻塞访问函数可以较好地解决设备的读写,但是如果有了异步通知
就更方便了。异步通知的意思是:旦设备就绪,则主动通知应用程序,这样应用程序根本
就不需要查询设备状态,这点非常类似于硬件上“中断”地概念,比较准确的称谓是“信
号驱动的异步”。
我们先来看个使用信号驱动的例子,它通过,_r对
_启动信号机制,输入可获得时_r被调用,其源代码如下:
_100
_r
{
r_ຕ;
;
读取并输出_上的输入
r_,&,_ຕ;
0;
r"bຘ:"ิ,;๙
}
{
;
启动信号驱动机制
,_r;
_,_,;
_,ไ_;
_,_,ไ|;๙
最后进入个死循环,程序什么都不干了,只有信号能激发_r的运行
如果程序中没有这个死循环,会立即执行完毕
1;
}
程序的运行效果如下图:
26๔
为了使设备支持该机制,我们需要在驱动程序中实现函数,并在r函数中ณ
当数据被写入时,调用_函