BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #4022同步于 2009/3/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

关于内核的poll函数的编写,有些地方不明白

wei04
2009/3/9镜像同步5 回复
在ldd3,poll函数编写那块,遇到一个问题: 如果两个不同的线程分别对同样一个设备(通过不同文件描述符)进行poll操作,如果线程A在poll返回后,说明可读(可写),然后调用 read(write)调用,那么此时I/O操作不会阻塞,但是假设就在poll与read这段空隙内,线程B也开始对设备进行poll操作(此时线程A 的poll函数已经释放锁),然后进入I/O操作,这时无论A和B线程哪个先进行,如果耗尽了设备的缓冲,那么必然还是会导致其中一个线程的I/O阻塞,这样POLL的作用就等于没有了。。。(我理解的是poll的作用是让后续的I/O函数能够无阻塞运行)。 不知道我理解的对不对,请大家指点一下。[em17]
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
hobby机器人#1 · 2009/3/9
没太明白LZ描述的意思,希望你能把你的环境再介绍一下 我们这里有人做过一个字符驱动,insmod这个设备之后,再用open打开并返回一个fd,然后select查看这个驱动里面的一个flag。 我们用的时候发现,创建两个设备结点,主设备号相同,次设备号不同,然后分别open并返回两个fd。运行的表现是,fd数值不同,但是访问起来,完全不能正常工作,感觉虽然设备节点不同,驱动中的flag却是同一个。不过也可能因为我们poll里面没加锁
wei04机器人#2 · 2009/3/10
嗯,我的意思是进程A和进程B同时打开一个设备。你这种情况是打开两个不同的设备,应该没有什么问题才是,可能你驱动里头每个设备都共享一个全局的flag变量,这样竞争就可能会造成问题 【 在 hobby 的大作中提到: 】 : 没太明白LZ描述的意思,希望你能把你的环境再介绍一下 : 我们这里有人做过一个字符驱动,insmod这个设备之后,再用open打开并返回一个fd,然后select查看这个驱动里面的一个flag。 : 我们用的时候发现,创建两个设备结点,主设备号相同,次设备号不同,然后分别open并返回两个fd。运行的表现是,fd数值不同,但是访问起来,完全不能正常工作,感觉虽然设备节点不同,驱动中的flag却是同一个。不过也可能因为我们poll里面没加锁
Bergwolf机器人#3 · 2009/3/10
加锁呗 【 在 wei04 (ldw04) 的大作中提到: 】 : 嗯,我的意思是进程A和进程B同时打开一个设备。你这种情况是打开两个不同的设备,应该没有什么问题才是,可能你驱动里头每个设备都共享一个全局的flag变量,这样竞争就可能会造成问题
wei04机器人#4 · 2009/3/10
。。。 【 在 Bergwolf 的大作中提到: 】 : 加锁呗
hobby机器人#5 · 2009/3/10
【 在 wei04 的大作中提到: 】 : 嗯,我的意思是进程A和进程B同时打开一个设备。你这种情况是打开两个不同的设备,应该没有什么问题才是,可能你驱动里头每个设备都共享一个全局的flag变量,这样竞争就可能会造成问题 嗯 flag在驱动里面是全局的