5 c语言调用Linux的sleepy函数,Linux设备驱动程序学习( 五 )


当 poll 调用完成,结构被重新分配, 所有的之前加入到 poll 表的等待队列入口都会从表和它们的等待队列中移出.{
pt;
* table;
int error;
int ;
[S];
};
{
* next;
* entry;
[0];
};
异步通知
通过使用异步通知,应用程序可以在数据可用时收到一个信号,而无需不停地轮询 。
启用步骤:
(1)它们指定一个进程作为文件的拥有者:使用 fcntl 系统调用发出命令,这个拥有者进程的 ID 被保存在 filp-> 。目的:让内核知道信号到达时该通知哪个进程 。
(2)使用 fcntl 系统调用,通过命令设置标志 。
内核操作过程
1.被调用时filp->被赋值 。
2. 当被执行来打开 , 驱动的方法被调用.这个标志在文件被打开时缺省地被清除 。
3. 当数据到达时,所有的注册异步通知的进程都会被发送一个 SIGIO 信号 。
Linux 提供的通用方法是基于一个数据结构和两个函数,定义在 。
数据结构:
{
;
;
*; /*list */
*;
};
驱动调用的两个函数的原型:
int (int fd,file *filp, int mode,**fa);
void (**fa, int sig, int band);
当一个打开的文件的标志被修改时,调用 来从相关的进程列表中添加或去除文件 。除了最后一个参数, 其他所有参数都时被提供给方法的相同参数并被直接传递 。当数据到达时,被用来通知相关的进程,它的参数是被传递的信号(常常是 SIGIO)和 band(几乎都是 ) 。
这是实现方法的:
int (int fd,file *filp, int mode)
*dev = filp->;
(fd, filp, mode, &dev->);
当数据到达, 下面的语句必须被执行来通知异步读者. 因为对读者的新数据通过一个发出 write 的进程被产生, 这个语句出现在的 write 方法中:if (dev->)
(&dev->, SIGIO, ); /*注意, 一些设备也针对设备可写而实现了异步通知,在这个情况, 必须以模式调用.*/
当文件被关闭时必须调用 方法,来从活动的异步读取进程列表中删除该文件 。尽管这个调用仅当 filp-> 被设置为时才需要,但不管什么情况,调用这个函数不会有问题,并且是普遍的实现方法 。以下是的方法的一部分:/*this filp from thefilp's */
(-1, filp, 0);
异步通知使用的数据结构和几乎相同,因为他们都涉及等待事件 。区别异步通知用file 替代. 队列中的 file 用获取 , 一边给进程发送信号 。的实验(poll和方法的实现):
ARM9实验板的实验现象是:
[@]#cd /lib//
[@]# pipe.ko
[@]#cat /proc/
:
1 mem
2 pty
3 ttyp
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
81
89 i2c
90 mtd
116 alsa
128 ptm
136 pts
180 usb
189
204
252 pipe
253
254 rtc
Block :
1
256 rfd
7 loop
31
93 nftl
96 inftl
179 mmc
[@]#cd /dev/
[@]#
[@]#cd /tmp/
[@]#./ &
[@]#open!
open!
: =21 !
: =21 !
close!
close!
!
!
[@]#echo> /dev/
[@]#read fromcode=20
[0]=1 [1]=2 [2]=3 [3]=4 [4]=5
[5]=6 [6]=7 [7]=8 [8]=9 [9]=0
[10]=1 [11]=2 [12]=3 [13]=4 [14]=5
[15]=6 [16]=7 [17]=8 [18]=9 [19]=0
read fromcode=1
[0]=
[1]=2 [2]=3 [3]=4 [4]=5
[5]=6 [6]=7 [7]=8 [8]=9 [9]=0
[10]=1 [11]=2 [12]=3 [13]=4 [14]=5
[15]=6 [16]=7 [17]=8 [18]=9 [19]=0
[@]#echo 234 > /dev/
[@]#read fromcode=15
[0]=1 [1]=2 [2]=3 [3]=4 [4]=5
[5]=6 [6]=7 [7]=8 [8]=9 [9]=0
[10]=1 [11]=2 [12]=3 [13]=4 [14]=
[15]=6 [16]=7 [17]=8 [18]=9 [19]=0