Linux系统下-进程间通信(消息队列-详解)
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSGKEY 123
struct msgstru
{
long msgtype;
char msgtext[2048];
};
void main()
{
struct msgstru msgs;
char str[256];
int msg_type;
int ret_value;
int msqid;
msqid=msgget(MSGKEY,IPC_EXCL);
if(msqid < 0)
{
msqid = msgget(MSGKEY,IPC_CREAT|0666);
if(msqid <0)
{
printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));
exit(-1);
}
}
while (1)
{
printf("input message type(end:0):");
scanf("%d",&msg_type);
if(msg_type == 0)
break;
printf("input message to be sent:");
scanf ("%s",str);
msgs.msgtype = msg_type;
strcpy(msgs.msgtext, str);
ret_value = msgsnd(msqid,&msgs,sizeof(msgs.msgtext),IPC_NOWAIT);
if(ret_value < 0)
{
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));
exit(-1);
}
}
msgctl(msqid,IPC_RMID,0);
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSGKEY 123
struct msgstru
{
long msgtype;
char msgtext[2048];
};
void childproc()
{
struct msgstru msgs;
int msgid,ret_value;
char str[512];
while(1)
{
msgid = msgget(MSGKEY,IPC_EXCL);
if(msgid < 0)
{
printf("msq not existed! errno=%d\n");
sleep(2);
continue;
}
ret_value = msgrcv(msgid,&msgs,sizeof(msgs.msgtext),0,0);
printf("text=[%s] pid=[%d]\n",msgs.msgtext,getpid());
}
return;
}
void main()
{
childproc();
}