system V 进程间通讯
2004-12-03 00:37
351 查看
消息队列可以实现多进程对多进程的进程间通讯。
涉及主要结构是 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
涉及主要结构是 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
相关文章推荐
- MortIIs Story
- IoC Introduction
- Solaris+Redhat+Windows共存
- API版本的TrimNull函数
- API版本的TrimNull函数
- IoC模式的类型及其实现
- Solaris 10 的困惑与喜悦
- 中国DNN当前的运作方式
- [导入]Linux内核飞行十二年[转贴]
- 2004-11-30 Sybase EBF 12150: 12.5.3 IR
- 保护卡自动改IP程序实现方法(根据现有保护卡的种种迹象猜的)
- 理解网页中各种不常用的
- 电灯泡杂谈
- property procedures offers a few advantages
- [转载]大学生创业:一个硬件网站站长自述创业经历
- 到神农架看看吧
- HTML文档中小meta的大作用
- 一份不错的性能测试计划模版,可惜是英文的。(转自QACity)
- 好像知道了什么是喝花酒
- 网页制作小技巧