完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
当一个进程睡眠, 它这样做以期望某些条件在以后会成真.任何睡眠的进程必须在它再次醒来时检查来确保它在等待的条件真正为真. 最常用的函数为:
wait_event_interruptible(queue, condition) 其中queue 是要用的等待队列头. 注意它是"通过值"传递的. 条件是一个被这个宏在睡眠前后所求值的任意的布尔表达式; 直到条件求值为真值, 进程继续睡眠。 睡眠唤醒的函数为: void wake_up_interruptible(wait_queue_head_t *queue); 通过视频中将到的代码可以看出,使用了wait_event_interruptible()后,测试程序使用while循环读取按键状态也不会占据99%的CPU资源了, 进程会在条件不满足时进入睡眠,知道按键按下后,由wake_up_interruptible() 唤醒。 同步的另一种方法是使用select、poll机制。它是一种非阻塞 I/O 的应用程序常常使用的机制。 poll, select 和epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞。file_operations结构体中poll的原型为: unsigned int (*poll) (struct file *filp, poll_table *wait); 函数主要的作用就是为用户空间的poll、select提供一个系统调用。最后返回一个mask。 视频中poll的代码很简单,主要使用了poll_wait ()函数。 void poll_wait (struct file *, wait_queue_head_t *, poll_table *); 用户空间在调用poll前设置了struct pollfd fds[1];通过对fd和events参数的指定,使得在fd发生了events指定的条件后唤醒。最后判断ev_press是否按下,并返回位掩码。应用程序通过返回值是否为0判断是否需要读取按键状态。 视频还讲了一种异步的方法读取按键值。file_operations结构体中fasync原型为: int(*fasync) (int fd, struct file *filp, int on) 驱动程序需要在该函数中通过fasync_helper()实现。fasync_helper 被调用来从相关的进程列表中添加或去除入口项, 当 FASYNC 标志因一个打开文件而改变。它的所有参数除了最后一个, 都被提供给 fasync 方 法并且被直接传递。当数据到达时 kill_fasync 被用来通知相关的进程。它的 参数是被传递的信号(常常是 SIGIO) 和 band, 这几乎都是 POLL_IN。 中断触发后通过kill_fasync()来唤醒进程。应用程序中signal设置信号,fcntl设置FASYNC标志位。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4903 浏览 0 评论
87424 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4742 浏览 2 评论
3628 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2489 浏览 0 评论
2020浏览 3评论
1301浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1360浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1244浏览 0评论
1182浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 09:14 , Processed in 0.909387 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号