#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define MSG_KEY 0x9091
#define DATA_SIZE 1024
typedef struct my_msgbuf{
long mtype;
char data[DATA_SIZE];
}MSGBUF;
int main(int argc,char* argv[])
{
int nMsgID;
MSGBUF msgbuf;
struct msqid_ds info;
nMsgID=msgget(MSG_KEY,IPC_CREAT|0666);
if(nMsgID<0)
{
perror("msgget");
return -1;
}
printf("Message Queue ID: %d\n",nMsgID);
printf("===============================================\n");
msgbuf.mtype=1;
strcpy(msgbuf.data,"Hello Word!");
if(msgsnd(nMsgID,&msgbuf,sizeof(msgbuf)-sizeof(long),IPC_NOWAIT)<0)
{
printf("Send Message Error: errno=%d message=%s\n",errno,strerror(errno));
}
else
{
printf("Send Message Right!\n");
msgbuf.mtype=1;
if(msgrcv(nMsgID,&msgbuf,sizeof(msgbuf),1,IPC_NOWAIT)>0)
{
printf("Recv Message: %s\n",msgbuf.data);
}
else
{
perror("msgrcv");
}
}
if(msgctl(nMsgID,IPC_STAT,&info)<0)
{
perror("msgctl[IPC_STAT]");
}
else
{
printf("msgsnd size=%lu\n",sizeof(msgbuf)-sizeof(long));
printf("read-write:%03o,cbytes=%lu,qnum=%lu,qbytes=%lu\n",
info.msg_perm.mode&0777,info.msg_cbytes,
info.msg_qnum,info.msg_qbytes);
info.msg_qbytes=(((sizeof(msgbuf)-sizeof(long))*1000)/64)*64;
if(msgctl(nMsgID,IPC_SET,&info)<0)
{
perror("msgctl[IPC_SET]");
}
else
{
printf("===============================================\n");
msgbuf.mtype=1;
strcpy(msgbuf.data,"Hello Word!");
if(msgsnd(nMsgID,&msgbuf,sizeof(msgbuf)-sizeof(long),IPC_NOWAIT)<0)
{
printf("Send Message Error: errno=%d message=%s\n",errno,strerror(errno));
}
else
{
printf("Send Message Right!\n");
if(msgrcv(nMsgID,&msgbuf,sizeof(msgbuf),1,IPC_NOWAIT)>0)
{
printf("Recv Message: %s\n",msgbuf.data);
}
else
{
perror("msgrcv");
}
}
if(msgctl(nMsgID,IPC_STAT,&info)<0)
{
perror("msgctl[IPC_STAT]");
}
else
{
printf("msgsnd size=%lu\n",sizeof(msgbuf)-sizeof(long));
printf("read-write:%03o,cbytes=%lu,qnum=%lu,qbytes=%lu\n",
info.msg_perm.mode&0777,info.msg_cbytes,
info.msg_qnum,info.msg_qbytes);
}
}
}
if(msgctl(nMsgID,IPC_RMID,NULL)<0)
{
perror("msgctl[IPC_RMID]");
}
return 0;
}