proto.h
#ifndef PROTO_H__
#define PROTO_H__#define KEYPATH "/etc/hosts"
#define KEYPROJ 'A'
#define NAMESIZE 32
#define MSG_STU 1
struct msg_st
{
long mtype;
char name[NAMESIZE];
int math;
int chinese;
};
#endif
snder.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"
int main()
{
key_t key;
struct msg_st sbuf;
int msgid;
key = ftok(KEYPATH,KEYPROJ);
if(key < 0)
{
perror("ftok()");
exit(1);
}
msgid = msgget(key,0);
if(msgid < 0)
{
perror("msgid()");
exit(1);
}
sbuf.mtype = MSG_STU;
strcpy(sbuf.name,"Alan");
sbuf.math = rand()%100;
sbuf.chinese = rand()%100;
if(msgsnd(msgid,&sbuf,sizeof(sbuf)-sizeof(long),0) < 0)
{
perror("msgsnd()");
exit(1);
}
puts("ok!");
exit(0);
}
rcver.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"
int main()
{
int msgid;
key_t key;
struct msg_st rbuf;
key = ftok(KEYPATH,KEYPROJ);
if(key < 0)
{
perror("ftok()");
exit(1);
}
msgid = msgget(key,IPC_CREAT|0600);
if(msgid < 0)
{
perror("msgid()");
exit(1);
}
while(1)
{
if(msgrcv(msgid,&rbuf,sizeof(rbuf)-sizeof(long),0,0) < 0)
{
perror("msgrcv()");
exit(1);
}
if(rbuf.mtype == MSG_STU)
{
printf("name = %s\n",rbuf.name);
printf("math = %d\n",rbuf.math);
printf("chinese = %d\n",rbuf.chinese);
}
}
msgctl(msgid,IPC_RMID,NULL);//这段代码执行不到,可以把这段代码写到信号处理函数中,然后ctrl+c结束
/*if error*/
exit(0);
}
可以用ipcs命令查看建的消息队列
用ipcrm -s+semid 删除一个消息队列