消息队列可以实现多进程对多进程的进程间通讯。
涉及主要结构是 struct msg ,这个结构是自定义的,消息队列函数使用指向这个结构的指针。
在这个结构中,只有一个成员long id 必须有,是消息号。
msgsnd()用于发送 msgrcv()用于接受。另外使用ipcs -qo 查看你建立的消息队列,根据你使用的
帐号可以分辨出哪个队列是你的,并且可以看到当前的消息数量等信息。
函数的具体参数说明和ipcs命令的详细参数请使用 man 查看。
疑问解答:
Q:消息队列的server可以分辨出谁发出的消息么?
A:当然可以,在client发送消息的时候,使用getpid()把进程号送到server进行分辨,或者在
msg struct中自定义分辨成员。
Q:saerver如何处理多个client的消息队列?
A:单server对多client时,可以考虑如下实现。server 建立公共消息队列,接受请求,当有
client请求时,使用client的pid建立该client的私有队列,并把队列id传送给client以后
的消息走私有队列。
简单源代码例子:
solaris 8 workshop6.2 C++5.3
svmsg.h:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#define KEY 1234L
#define MAXMESGDATA (1024-sizeof(long))
#define MESGHDRSIZE (sizeof(struct mymesg)-MAXMESGDATA)
struct mymesg
{
long mesg_type;
long mesg_len;
char mesg_data[MAXMESGDATA];
};
ssize_t mesg_send(int id,struct mymesg *mptr)
{
return(msgsnd(id,&(mptr->mesg_data),mptr->mesg_len,0));
}
ssize_t mesg_recv(int id,struct mymesg *mptr)
{
ssize_t n;
n=msgrcv(id,&(mptr->mesg_data),MESGHDRSIZE,0,0);
mptr->mesg_len=n;
return n;
}
msgserver.cxx:
#include "svmsg.h"
#include <strings.h>
int main(int argc,char *argv[])
{
int msqid;
struct mymesg mesg;
msqid=msgget(KEY,0660|IPC_CREAT);
printf(" msqid : %d ",msqid);
//while(1)
{
mesg_recv(msqid,&mesg);
printf(" data : %s ",mesg.mesg_data);
mesg.mesg_data[0]='/0';
printf("->");
system(" ls -lrt");
}
return 0;
}
msgclient.cxx:
#include "svmsg.h"
#include <unistd.h>
#include <strings.h>
int main(int argc,char *argv[])
{
int msqid;
struct mymesg mesg;
msqid=msgget(KEY,0660);
printf(" msqid : %d ",msqid);
mesg.mesg_type=1;
sprintf(mesg.mesg_data,"%s","hello");
int i=mesg_send(msqid,&mesg);
printf(" %d /n",i);
return 0;
}
ipcs -qo命令:
IPC status from <running system> as of 2004Äê12ÔÂ03ÈÕ ÐÇÆÚÎå 17ʱ43·Ö05Ãë CST
T ID KEY MODE OWNER GROUP CBYTES QNUM
Message Queues:
q 0 0x2e781d5 --rw-r--r-- root root 0 0
q 2 0x102d -Rrw-r--r-- root root 0 0
q 653 0x4d2 -Rrw-rw---- unicom staff 0 0
e2501%
如有需要讨论,请使用邮件 conquer@vip.sina.com