向高手请教:我现在在看别人的驱动,驱动里面对resmgr_io_funcs_t.unblock函数重新写了,于是我去查看 Resource Manager里面Handling client unblocking due to signals or timeouts.但是看不太明白.
1.unblock的基本原理是什么?
2.好象是Client发送PULSE到Resource Manager,可是在挂起的时候Client怎么会发送这样一个PULSE呢?
有谁对这个熟悉,给大概讲一讲啊.
“unblock” 是一个在REPLY BLOCK下的客户端,希望解除其REPLY BLOCK状态。
被挂起的Client不会发送PULSE的,那个要求UNBLOCK的PULSE是由系统(内核)发给resource manager的。
考虑这样一个情形。
cat </dev/ser1
-
cat 程序(client)向串口驱动(resource manager)请求读数据,串口没有数据,不作应答,这样cat就REPLY BLOCK了。
-
如果在这时按"Ctrl-C",这个Ctrl-C由鍵盘驱动收到后,最后变成一个SIGTERM,通过内核,发向cat.
-
内核发现cat正在等串口驱动的回答,内核将SIGTERM入队,然后向串口驱动发PULSE,告诉resource manager,“你有一个Client希望Unblock”。
-
Resource Manager进行Unblock处理,最后做一个MsgError()/MsgReply(),放走client.
-
client (cat) 脱离挂起状态,立即收到入队的SIGTERM,然后处理(退出运行)。
注意在4)里,resource manager也可以选择不响应pulse,这样cat就会继续被挂在那里。用户的感觉就是Ctrl-C也杀不了进程.
多谢xtang了,有些明白了.