system V 进程间通讯

消息队列可以实现多进程对多进程的进程间通讯。
涉及主要结构是  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&Auml;ê12&Ocirc;&Acirc;03&Egrave;&Otilde; &ETH;&Ccedil;&AElig;&Uacute;&Icirc;&aring; 17&Ecirc;±43·&Ouml;05&Atilde;&euml; 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值