消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
//消息队列A
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
typedef struct msgbuf{
long mtype;
char mtext[256];
}msgbuf_t;
int main(){
key_t key;
key = ftok("hello",31);
if(key==-1){
perror("ftok");
return 1;
}
int msg = msgget(key,IPC_CREAT|0664);
printf("key = %d\n",key);
if(msg==-1){
perror("msgget");
return 2;
}
msgbuf_t mb;
mb.mtype = 3;
strcpy(mb.mtext,"this is test\n");
int s = msgsnd(msg,&mb,strlen(mb.mtext)+1,0);
if(s==-1){
perror("msgsnd");
return 3;
}
return 0;
}
//消息队列B
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
typedef struct msgbuf{
long mtype;
char mtext[256];
}msgbuf_t;
int main(){
key_t key;
key = ftok("hello",31);
if(key==-1){
perror("ftok");
return 1;
}
int msg = msgget(key,IPC_CREAT|0664);
printf("key = %d\n",key);
if(msg==-1){
perror("msgget");
return 2;
}
msgbuf_t mb;
ssize_t s = msgrcv(msg,&mb,256,3,0);
if(s==-1){
perror("msgsnd");
return 3;
}
printf("%s\n",mb.mtext);
return 0;
}