致lonki先生的一封信!

lonki先生:
您好!

我对Message Passing 这个问题困扰了快一个月了,一直得不到解决,你能帮我吗?

我的目的很简单,就是写一个Client\Server的程序,Client方用MsgSend()向Serverv方 发送一个消息,然后,在Server方用MsgReceive()接收,并用printf()显示出来, 然后MsgReply()给Client方一个答复,并在Client方用printf()将其显示出来。

总体思想就是这样,可我都想了试了快一个月了,还是收不到消息。更不用说听到答复了。

其中困扰我的问题就是用ConnectAttach()是,如何确定pid和chid?

你能不能给我一个原代码,让我学习学习,让我自己摸索,都这么长时间了,也没一点进展,快急死我了。

嗯?
上次不是给你推荐了一个网站上的教程了吗?
那上面有多个例子的源代码啊?你没有试着编译运行一下吗?
ConnectAttach()中要填写对方的pid和对方建立的一个接收消息的通道,因此你需要有办法来获取对方的pid和chid。比如那个教程中的例子就是子进程通过getppid()函数来获取父进程的pid,父进程在启动子进程时把chid作为命令行参数传递给子进程,这样子进程就获得了ConnectAttach()所需的两个参数了。之后就可以向父进程发消息了。

另外,还可以通过注册名字的方式在两个没有关系的进程间建立消息连接,你可以看看帮助中name_attach()函数的解释,其中还有一个Server/Client的简单例子

我想这是所有初次接触QNX的人在学习MessagePassing都会遇到的一个问题。其实,QNX的MessagePassing最广泛地用在比较低层的地方,你不一定非要在你的应用程序中用Message Passing,还有很多IPC的方法可以使用,正如QNX所说,这些POSIX的IPC最终是在MessagePassing上实现的。
比如说,你有一个ResourceManager创建了一个设备文件名,如/dev/ser1,你用fd=open("/dev/ser1",o_flag),则你得到的fd就是一个coid。因为devc-ser创建了一个chid,这个设备的管理进程的pid,tid,chid都包含在/dev/ser1所代表的一个结构中。因而,一切都会OK。name_attach()就是这样一种简单的用法,创建一个大家都知道的点,来传递pid,tid及chid.

OK,你可以不用ResourceManager,也可以不用name_attach()来创建这个共同点,对初学者来说这太QNX了,所以,你可以采取一些简单的传统的方法来做。比如,你的server创建一个chid后,通过getpid()得到自身的PID,然后,写到一个文件中,比如说/home/serverinfo,client端打开这个文件,读出serverinfo 中的pid,tid及chid就OK了。或者,打开一个FIFO来传递会更好些?再或者设置一些你自己定义的环境变量?再或者,如果两个进程这间有关系,你用server 启动client (用spwan*),通过参数来传递?等等。

lonki: 能不能把网址贴一下阿,先谢了! :wink: