还是前面的问题??请问qnx6.x的资源管理器到底是干什末用的?

唐先生说的,我不是特别明白.
比如两个进程(父子进程或是独立的两个进程)可以通过ipc的各种形式进行通信。
用资源管理器是如何实现的呢??
最好能有例程比较两种方法的异同???
谢谢!!!

我再试试 :smiley: 其实也就是分类不同而已。

首先QNX提供了进程间通讯。不一定父子进程,任何进程间,都能通过进程号和频道号进行通讯。(ChannelCreate()/ConnectAttach()/MsgSend()/MsgReceive()/MsgReply())

问题通常在于,一个进程如何知道对方的进程号和频道号呢?为了解决这个问题,QNX提供了把进程、频道号同一个“名字”联系起来的方法。(name_attach()) 这样只要知道对方登记的名字,直接就可以建立通道,进行通讯。(name_open())

接下来的问题是,即使建立起了通道,到底“说”些什么呢?如果双方都是你自已写的程序那好办,什么都行,如果对方是别人写的程序,那么到底要说些什么呢?

QNX为此提供了最基本的消息,“输入输出消息”。(/usr/include/sys/iomsg.h)这包括了最基本的UNIX输入输出请求,_IO_OPEN/_IO_READ/_IO_WRITE/_IO_CLOSE。这样,一个进程就可以向另一个进程发这些消息,来进行“输入输出”。事实上,C库里的open(), read(), write(), close()就是把参数转化成这些消息发出去。能够处理IOMSG的进程,通常被称为IO管理器。

除了处理输入输出以外,有些管理器还有特殊的消息。比如网络协议栈就有一些自已的消息象BIND/ACCEPT那样的东西。

抽象的来看,所有这些管理器都有一个特点,就是它们都“管理”一个资源。(登记/dev/ser1这个名字的进程管理了串口,登记/dev/socket这个名字的进程管理了网络协议)所以又统称它们为资源管理器。所有的资源管理器的处理都是相似的,都是接收一条消息,处理,返回结果。所以QNX又提供了资源管理器库,这样程序员只要很少的代码,就可以实现一个 /dev/abc, 并支持基本的比如 open()/read()/write()/close() 请求了。

谢谢
唐先生拉

十分感谢

唐先生实在是大师风范,循循善诱,百问不厌!非常感谢!

普通进程注册是使用name_attach,资源管理器用的是resmgr_attach,这两个看起来好像没啥区别,资源管理器的特点是不是在于路径的“前缀”管理?

另外,请问下资源管理器本质是不是还是用到qnx的message-passing,即阻塞方式进行进程间通讯? 因为看见这段话“A key point is that all communications between the client program and the resource
manager are done through native IPC messaging.”

name_attach()与resmgr_attach()还是不完全一样的。

name_attach()了以后,你其实是把一个名字与一个频道号对应了起来。实际程序处理,你还是需要自己写个循环,接收消息,分析处理消息…

resmgr_attach()在attach的同时,还可以挂接你需要的回调函数,以支持标准的 open()/read()/close()这样的操作。即使你不给出回调函数,资源管理器框架也会提供基本的服务。(只做一个resmgr_attach(),其他什么也不做,你也可以ls 你的名字,甚至 cat “something” > 到你的名字,这至少意味着open/write/stat/close都已经支持了)

简单的说,resmgr_attach()不仅只把一个名字与一个频道连系起来,它还有一整套“资源管理器框架”会被自动联进来,进行最基本的资源管理。

所有的东西的本质都是QNX的message-passing. 都是在(ChannelCreate()/ConnectAttach()/MsgSend()/MsgReceive()/MsgReply()) 上的东西。

感谢tang老师回答,不过资源管理器里面把读写分开了,感觉不如直接用消息方便,因为MsgSend_r里面可以直接把入参和出参都传给对方,一次性就可以完成写和读操作。
像资源管理器里面的自定义
int my_write (resmgr_context_t *ctp, io_write_t *msg, RESMGR_OCB_T *ocb), 资源管理器能否往io_write_t *msg指针里面写东西呢?就是执行一次写操作,顺便带些东西回到自己的进程里。

资源管理器是按标准文件系统来实现的。也就是说,客户端不需要调用任何特殊的函数,就是用 write(fd, buf, len) 就可以把数据写入你的资源管理器。或者,cat afile >/dev/yourmanage 这样的命令也能正常工作了。

如果像你所说,修改io_write_t以传回数据的话,那就是客户端需要特殊的函数(而不是wirte())来access你的管理器了。

即使是标准的文件系统,也有附合你的要求的操作的。比如devctl()就是一个可以同时传入、传出数据的POSIX调用。

今天看了手册,里面说资源管理器不局限于使用posix的read、write接口,也可以使用消息发送和其通讯,只需在管理器里面message_attach上自己callback函数,这样看起来,好像和你提到的devctl很像,直接带入参、出参,一次性完成数据传递获取。是不是这样子呢?