介绍
代码
protocol.h
#ifndef _PROTOCOL_H__
#define _PROTOCOL_H__
#define PATHNAME "./protocol.h"
#define PROJID 0x00000001UL
#define INFOSIZE 32
typedef struct message_st{
long mtype;
int no;
char info[INFOSIZE];
}message_t;
#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 "./protocol.h"
int main(){
key_t key;
int msgid;
message_t msgsend;
key = ftok(PATHNAME, PROJID);
if(key < 0){
perror("ftok()");
exit(1);
}
msgid = msgget(key, 0);
if(msgid < 0){
perror("msgget()");
exit(1);
}
msgsend.mtype = 1;
msgsend.no = 0;
strcpy(msgsend.info, "saika");
if(msgsnd(msgid, &msgsend, sizeof(msgsend) - sizeof(long), 0) < 0){
perror("msgsnd()");
exit(1);
}
puts("send ok");
exit(0);
}
recviver.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "./protocol.h"
int main(){
key_t key;
int msgid;
message_t msgrecv;
key = ftok(PATHNAME, PROJID);
if(key < 0){
perror("ftok()");
exit(1);
}
msgid = msgget(key, IPC_CREAT | 0644);
if(msgid < 0){
perror("msgget()");
exit(1);
}
if(msgrcv(msgid, &msgrecv, sizeof(msgrecv) - sizeof(long), 0, 0) < 0){
perror("msgsnd()");
exit(1);
}
printf("no = %d, info = %s\n", msgrecv.no, msgrecv.info);
msgctl(msgid, IPC_RMID, NULL);
exit(0);
}
运行结果
![01](https://i-blog.csdnimg.cn/blog_migrate/b15963c5bcd876ac8012a4ba56596069.png#pic_center)
总结
- 不同进程之间想要使用同一个消息队列,必须使用一个相同的 key 值,key 值可以通过一个相同的 path 加上 相同的 proj_id 确保唯一且相同。
- 在父子进程之间通信时, key 值可以省略,直接使用 IPC_PRIVATE 代替 key。