消息队列的实现:
接收端:msgRecv.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#define MAXSIZE 512
struct msg_t{
long msg_type;
char text[MAXSIZE];
};
int main(int argc, char *argv[])
{
int msgid = -1;
struct msg_t data;
long msgtype = 0;
msgid = msgget((key_t)1234, 0666| IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed\n");
exit(-1);
}
while (1)
{
if (msgrcv(msgid, (void *)&data, MAXSIZE, msgtype, 0) == -1)
{
fprintf(stderr, "msgrcv failed\n");
exit(-1);
}
printf("recv: %s\n", data.text);
if (strncmp(data.text, "end", 3) == 0)
break;
}
if (msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "msg delete failed\n");
exit(-1);
}
return 0;
}
发送端:msgSend.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
#define MAXSIZE 512
struct msg_t{
long msg_type;
char text[MAXSIZE];
};
int main(int argc, char *argv[])
{
int msgid = -1;
struct msg_t data;
char buffer[MAXSIZE+1];
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr, "msgget failed\n");
exit(-1);
}
while (1)
{
printf("enter send buffer: ");
fgets(buffer, MAXSIZE, stdin);
data.msg_type = 1;
strcpy(data.text, buffer);
if (msgsnd(msgid, (void*)&data, MAXSIZE, 0) == -1)
{
fprintf(stderr, "msgsend failed\n");
exit(-1);
}
if (strncmp(buffer, "end", 3) == 0)
break;
}
sleep(1);
return 0;
}