/*
*建立消息队列,并向里面添加消息
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/stat.h>
#define MAX_TEXT 512
#define MSG_KEY 335
struct my_msg_st
{
long my_msg_type;
char some_text[MAX_TEXT];
};
int main(void)
{
int i = 10;
int running = 1;
struct my_msg_st some_data;
int msgid;
char buffer[BUFSIZ];
msgid = msgget((key_t)MSG_KEY,IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
if(msgid == -1)
{
printf("create msg queue failed\n");
msgid = msgget((key_t)MSG_KEY,IPC_EXCL|S_IRUSR|S_IWUSR);
}
if(msgid == -1)
{
fprintf(stderr,"msgget failed with error:%d \n",errno);
exit(EXIT_FAILURE);
}
while(running)
{
printf("[%d]Enter some text:less than %d\n",msgid,MAX_TEXT);
fgets(buffer,BUFSIZ,stdin);
some_data.my_msg_type = 10;
strcpy(some_data.some_text,buffer);
if(msgsnd(msgid,(void *)&some_data,sizeof(some_data),0) == -1)
{
fprintf(stderr,"msgsnd failed\n");
exit(EXIT_FAILURE);
}
if(strncmp(buffer,"end",3) == 0)
{
running = 0;
}
}
exit(EXIT_SUCCESS);
}
/*
*从消息队列中取消息,然后删除它
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <sys/types.h>
#define MAX_TEXT 512
#define MSG_KEY 335
struct my_msg_st
{
long my_msg_type;
char some_text[MAX_TEXT];
};
int main(void)
{
int running = 1;
struct my_msg_st some_data;
int msgid;
long int msg_to_receive = 10;
msgid = msgget((key_t)MSG_KEY,IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
if(msgid == -1)
{
msgid = msgget((key_t)MSG_KEY,IPC_EXCL|S_IRUSR|S_IWUSR);
}
if(msgid == -1)
{
fprintf(stderr,"msgget failed with error:%d \n",errno);
exit(EXIT_FAILURE);
}
printf("prepare receive msg:%d\n",msgid);
while(running)
{
if(msgrcv(msgid,(void *)&some_data,sizeof(some_data),msg_to_receive,IPC_NOWAIT) == -1)
{
if(ENOMSG == errno)
{
printf("no msg receive\n");
continue;
}
fprintf(stderr,"msgrcv failed with error:%d\n",errno);
exit(EXIT_FAILURE);
}
printf("You wrote:%s",some_data.some_text);
if(strncmp(some_data.some_text,"end",3) == 0)
{
running = 0;
}
}
if(msgctl(msgid,IPC_RMID,0) == -1)
{
fprintf(stderr,"msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}