qnx:从API开始理解QNX -- 消息传递

从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161

1. 频道与连接
    Channel, Connect
    
    server:
        ChannelId = ChannelCreate(Flags);
    client:
        ConnectionId = ConnectAttach(Node, Pid, Chid, Index, Flag);
        Node: 机器号; Pid是服务进程号; Chid就是ChannelCreate后得到的频道号.
    连接的终止是ConnectDetach(),而频道的结束则是ChannelDestroy()了。不过,一般服务器都是长久存在的,不大有需要ChannelDestroy()的时候。
2.     发送,接收与应答
    Send, Receive, Reply

server:
        RecieveId = MsgReceive(ChannelId, ReceiveBuffer, ReceiveBufLength,&MsgInfo);
        ...Deal Recvd Msg....
        MsgReply(ReceiveId, ReplyBuf, ReplyLen);    
        
    client:
        MsgSend(ConnectionId, SendBuf, SendLen, ReplyBuf, ReplyLen);
        ....然后由OS将这个线程挂起...
        ....当服务器MsgReply()后,OS解除线程阻塞状态,客户端可以检查自己的ReceiveBuf看看应答效果...
        
3. 数据区与iov
虽然在客户端Header同databuf是两块不相邻的内存,但传递到服务器端的ReceiveBuffer里,就是连续的了。

客户端: "header" 与 "databuf" 是不连续的两块数据。
    SETIOV(&iov[0], &header, sizeof(header));
    SETIOV(&iov[1], databuf, datalen);
    MsgSendvs(ConnectionId, iov, 2, Replybf, ReplyLen);

服务器: 接收后,"header"与"databuf"被连续地存在ReceiveBuffer里。
    ReceiveId = MsgReceive(ChannelId, ReceiveBuffer, ReceiveBufLength, &MsgInfo);
    header = (struct header *)ReceiveBuffer;
    databuf = (char *)((char *)header + sizeof(*header));
    当指定的ReceiveBufLength小于实际收到的字节数,即MsgReceive不一定读完了所有来自client的数据,因此还需要查看MsgInfo,并使用MsgRead(ReceiveId,
                                ReceiveBuffer+ReceiveBufLength, // 指定存数据buffer起始地址
                                ReceiveBufLength, // 去缓冲区读数据时候的偏移量
                                MsgInfo->srcmsglen - MsgInfo->msglen    // 未读取完的数据长度    
                            ));

时间: 2024-10-11 04:34:17

qnx:从API开始理解QNX -- 消息传递的相关文章

从API开始理解QNX -- 消息传递

大家都知道QNX是个微内核结构的操作系统,靠的是进程间通讯来实现整个系统功能的.那么具体到写一个程序的时候,到底这个通讯是如何完成的呢?这章就是具体介绐最底层的消息传递API的.消息传递是通过内核进行的,所以所谓的API,实际也就是最底层的内核调用了.需要指出的是,真正在QNX上写程序的时候,很少会直接用到这些API,而是利用更高层的API,不过,知道这些底层的API对于将来理解建立在这些API上的界面,应该会有帮助的. 频道(Channel)与连接(Connect)       消息传递是基于

说说自己对RESTful API的理解s

REST不是英文上的rest单词,其英文缩写为presentational State Transfer ,直译为表现状态转移,咋看起来很学术,不懂,其实不用去死抠这个词的意思.REST是一种约束和架构(设计),符合这个风格的都算API.如果实在想了解REST ,直接看提出REST的那篇论文. 知乎上有句话总结的很好了,URL定位资源用HTTP动词(GET POST DELETE)描述操作. 其实只要理解以下几个原则就可以了: 1.提供资源定位 一般在计算机系统中,client和server通信

Spark笔记:复杂RDD的API的理解(上)

本篇接着讲解RDD的API,讲解那些不是很容易理解的API,同时本篇文章还将展示如何将外部的函数引入到RDD的API里使用,最后通过对RDD的API深入学习,我们还讲讲一些和RDD开发相关的scala语法. 1)  aggregate(zeroValue)(seqOp,combOp)  该函数的功能和reduce函数一样,也是对数据进行聚合操作,不过aggregate可以返回和原RDD不同的数据类型,使用时候还要提供初始值. 我们来看看下面的用法,代码如下: val rddInt: RDD[In

关于Android API的理解

举个例子: 比如程序中用到了android.content.ClipboardManager这个类, 而该类是在API 11才添加到 “库”. (原谅我,不理解Google API 文档里的 added in API 11这里是将其add到哪里了?如果有高人知道,分外感激) 那么在实际写代码及运行调试时要注意两点: Step 1: Android ApplicationMenifest.Xml文件 <uses-sdk android:minSDKVersion="11这里的数值必须不小于1

安卓开发_深入理解Handler消息传递机制

一.概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二.消息类(Message) 消息类是存放在MessageQueue中的,而一个MessageQueue中可以包含多个Message对象 每一个Message对象可以通过Message.obtain()或者Handler.obtainMessage()方法获得 一个Message具有的属性: 属性 类型 介绍 arg1 int 存放整型数

对RESTful Web API的理解与设计思路

距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很稳定了,所以我打算写篇总结,并在最近这段时间里提供一个ASP.net Web API的综合例子. 对四个HTTP方法的理解 众所周知,HTTP有四个方法,GET.POST.PUT和DELETE,分别对应数据库的SELECT.INSERT.UPDATE和DELETE,一般的教程说到这里也就Over了,

网上整理的对于Rest和Restful api的理解

一.什么是Rest? REST不是"rest"这个单词,而是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移,但这个翻译正常人根本看不懂,找到的一种最好理解的说法是,URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作. 二.Restful api接口有什么特征? REST描述的是在网络中client和server的一种交互形式:REST本身不实用,实用的是如何设计 RESTful API(RES

HTML5中的history API的理解和使用

如今前端框架层出不穷,大大的方便了我们平常工作中的开发,提高了开发的效率,然而,在使用框架的过程中还是很有必要了解其中一些自己感兴趣的功能的原生js实现方式. 我一直对如今一些框架的路由感兴趣,今天就来讲讲我在前端路由的学习心得. 何为路由?我的理解是在不刷新页面的情况下,通过更改页面的url来执行不同的程序操作,常见的前端路由实现方式有: 1,通过hash实现(在url后面加入#+路由名),使用hash实现路由的方式还是很常见的,一些比较火的前端框架中的路由都是通过hash实现,例如:Angu

我的第一篇博客随笔:关于angularjs API的理解心得。angular.bind() angular.boostrap()

angular.bind(obj,fun,args) obj:对象 fun:函数 arg:函数要传递的参数(可省略). 解释:将函数与对象动态绑定在一起 作用:实现调用数据模块化. demo:var Func = function(a){ this.a=a; } var obj=new Func(1); var fun=angular.bind(obj, function(i,j){alert(this.a+i+j)},4,2); fun();//7  var fun=angular.bind(