多进程间通过消息队列通讯

多进程间通过消息队列通讯简单示例

头文件:proto.h

#ifndef __PROTO_H__

#define __PROTO_H__

#define KEYPATH     "/etc/services"  
#define KEYID      'a'
#define NAMESIZE   1024

struct student_st       //自定义数据结构
{
  char name[NAMESIZE];
  int math;
  int chinese;
};

#endif

 

发送消息:sender.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include "proto.h"

typedef struct   //自定义消息结构体
{
  long mtype;
  struct student_st stu;
}msg_data;

int main()
{
  key_t key;
  int queueID,ret;
  msg_data data;

  key = ftok(KEYPATH,KEYID);  //创建key
  if(key<0)
  {
    perror("key");
    exit(1);
  }

  queueID = msgget(key,IPC_CREAT|0666); //获取消息队列ID
  if(queueID <0)
  {
    perror("msgget");
    exit(1);
  }

  data.mtype = 5;     //初始化消息体
  memcpy(data.stu.name,"Alon",4);
  data.stu.math = 100;
  data.stu.chinese = 30;

  ret = msgsnd(queueID,&data,sizeof(data.stu),IPC_NOWAIT|MSG_NOERROR);  //发送消息
  if(ret <0)
  {
    perror("msgrcv()");
    exit(1);
  }

  exit(0);   //退出
}

 

接收消息:rcver.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "proto.h"

typedef struct   //自定义消息体
{
  long mtype;
  struct student_st stu;
}msg_data;

int main()
{
  key_t key;
  int queueID,ret;
  msg_data data;

  key = ftok(KEYPATH,KEYID);  //创建key
  if(key<0)
  {
    perror("key");
    exit(1);
  }

  queueID = msgget(key,IPC_CREAT|0666);  //获取消息ID
  if(queueID <0)
  {
    perror("msgget");
    exit(1);
  }

  ret = msgrcv(queueID,&data,sizeof(data.stu),5,IPC_NOWAIT|MSG_NOERROR);  //读取消息队列中的消息
  if(ret <0)
  {
    perror("msgrcv()");
    exit(1);
  }

  printf("name:%s math:%d chinese:%d\n",data.stu.name,data.stu.math,data.stu.chinese);  //输出消息

  ret = msgctl(queueID,IPC_RMID,NULL);  //接收完成销毁消息队列ID
  if(ret <0)
  {
    perror("msgctl()");
    exit(1);
  }

  exit(0);  //退出
}

 

编译文件:Makefile

all: rcver sender

rcver:rcver.o
  $(CC) $^ -o $@

sender:sender.o
  $(CC) $^ -o $@

clean:
  $(RM) *.o rcver sender

 

posted @ 2022-08-03 10:05  *^VV^*  阅读(62)  评论(0编辑  收藏  举报