QNX操作系统信息传递
作者:网络转载 发布时间:[ 2013/8/12 10:48:30 ] 推荐标签:
5、消息传递的方向与MsgDeliverEvent()
客户端给服务器发送消息,服务器不能立刻应答而客户端不想等待。遇到这种情况,正确的做法是,告诉客户端,请求一段时间后会得到处理,客户端得以继续运行,一旦服务器完成任务,服务器需要一些方式告诉客户端请求完成。
客户端: 准备一个“通知事件”(Notification Event),并把这个事件用MsgSend()发给服务器端,意思是:“如果xxx情况发生的话,请用这个事件通知我”。
服务器: 收到这个消息后,记录下当时的rcvid,和传过来的事件,然后应答“好的,知道了”。
客户端: 因为有了服务器的应答,客户端不再阻塞,可以去做别的事
......
服务器: 在某个时刻,客户端所要求的“xxx情况”满足了,服务器调用 MsgDeliverEvent(rcvid, event);以通知客户端
客户端: 收到通知,再用MsgSend()发关“xxx 情况的数据在哪里?”
服务器: 用MsgReply()把数据返回给客户端
int MsgDeliverEvent (int rcvid,const struct sigevent *event);
event服务器不需要作修改 rcvid是服务器从客户端接收的。当服务器给客户端应答后,这个id将失去意义。另外MsgDeliverEvent是非阻塞函数。
6、常用API
ChannelCreate(), ChannelDestroy()
ConnectAttach(), ConnectDetach()
MsgDeliverEvent()
MsgError()
MsgRead(), MsgReadv()
MsgReceive(), MsgReceivePulse(), MsgReceivev()
MsgReply(), MsgReplyv()
MsgSend(), MsgSendnc(), MsgSendsv(), MsgSendsvnc(), MsgSendv(),
MsgSendvnc(), MsgSendvs(), MsgSendvsnc()
MsgWrite(), MsgWritev()
name_attach(), name_close(), name_detach(), and name_open()
7、总结
1)客户端在给服务发送消息的时候指定服务器应答缓冲区
2)服务器给客户端应答消息(MsgReply)的时候传递参数作为MsgSend返回值
3)服务器在MsgReceive的时候可以传递参数用于获取客户端发送的消息的一些信息
4)客户端在打开服务名字空间的时候系统会发送一个_IO_CONNECT 消息给服务器
5)客户端断开连接或者关闭名字空间的时候服务器会收到_PULSE_CODE_DISCONNECT脉冲
6)客户端视图从REPLY BLOCK解除阻塞的时候服务器会收到_PULSE_CODE_UNBLOCK脉冲
7)创建名字空间的时候自动设置了_NTO_CHF_DISCONNECT_NTO_CHF_COID_DISCONNECT 、_NTO_CHF_UNBLOCK 标准,故服务器可以收到对应系统脉冲
四、通知信号-脉冲
1、基本概念
脉冲其实更像一个短消息,也是在“连接”上发送的。脉冲大的特点是它是异步的。发送方不必要等接收方应答,直接可以继续执行。但是,这种异步性也给脉冲带来了限制。脉冲能携带的数据量有限,只有一个8位的"code"域用来区分不同的脉冲,和一个32位“value"域来携带数据。脉冲主要的用途是用来进行“通知”(Notification)。不仅是用户程序,内核也会生成发送特殊的“系统脉冲”到用户程序,以通知某一特殊情况的发生。
2、接收脉冲
知道频道上不会有别的消息,只有脉冲的话,可以用MsgReceivePulse()来只接收脉冲;如果频道既可以接收消息,也可以接收脉冲时,直接用MsgReceive(),只要确保接收缓冲(ReveiveBuf)至少可以容下一个脉冲(sizeof struct _pulse)可以了。如果MsgReceive()返回的rcvid是0,代表接收到了一个脉冲,反之,则收到了一个消息。
3、脉冲信号特点
1)有效传递40位数据(8位脉冲码,32位数据)
2)对发送者而言是非阻塞的
3)可以像其他消息一样被接受
4)脉冲会排队,只要接受者不是阻塞等待脉冲。
5)若没有脉冲,则接收者会阻塞等待脉冲

sales@spasvo.com