C语言消息队列
MsgQueue1.c
#include
#include
#include
#include
#include
#include
#include
#include
#define KEY 1234
struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mbuf[100]; /* message data */
};
//typedef struct msgbuf buf;
int main()
{
int msgid,ret;
pid_t pid;
struct msgbuf buf;
msgid = msgget(KEY,IPC_CREAT | IPC_EXCL);
if(-1 == msgid)
{
perror("msgget");
exit(1);
}
pid = fork();
if(-1 == pid)
{
perror("fork");
exit(1);
}
else if(0 == pid)
{
while(1)
{
scanf("%s",buf.mbuf);
buf.mtype = 1;
ret = msgsnd(msgid,&buf,sizeof(buf.mbuf),0);
if(-1 == ret)
{
perror("msgsnd");
exit(1);
}
if(strncmp(buf.mbuf,"end",3) == 0)
{
buf.mtype = 2;
msgsnd(msgid,&buf,sizeof(buf.mbuf),0);
break;
}
memset(buf.mbuf,0,sizeof(buf.mbuf));
}
}
else
{
while(1)
{
memset(buf.mbuf,0,sizeof(buf.mbuf));
ret = msgrcv(msgid,&buf,sizeof(buf.mbuf),2,0);
if(-1 == ret)
{
perror("msgrcv");
exit(1);
}
if(strncmp(buf.mbuf,"end",3) == 0)
{
kill(pid,SIGKILL);
break;
}
printf("\t\t%s\n",buf.mbuf);
}
waitpid(pid,NULL,0);
}
msgctl(msgid,IPC_RMID,NULL);
return 0;
MsgQueue2.c
#include
#include
#include
#include
#include
#include
#include
#include
#define KEY 1234
struct msgbuf
{
long mtype; /* message type, must be > 0 */
char mbuf[100]; /* message data */
};
//typedef struct msgbuf buf;
int main()
{
int msgid,ret;
pid_t pid;
struct msgbuf buf;
msgid = msgget(KEY,0);
if(-1 == msgid)
{
perror("msgget");
exit(1);
}
pid = fork();
if(-1 == pid)
{
perror("fork");
exit(1);
}
else if(0 == pid)
{
while(1)
{
scanf("%s",buf.mbuf);
buf.mtype = 2;
ret = msgsnd(msgid,&buf,sizeof(buf.mbuf),0);
if(-1 == ret)
{
perror("msgsnd");
exit(1);
}
if(strncmp(buf.mbuf,"end",3) == 0)
{
buf.mtype = 2;
msgsnd(msgid,&buf,sizeof(buf.mbuf),0);
break;
}
memset(buf.mbuf,0,sizeof(buf.mbuf));
}
}
else
{
while(1)
{
memset(buf.mbuf,0,sizeof(buf.mbuf));
ret = msgrcv(msgid,&buf,sizeof(buf.mbuf),1,0);
if(-1 == ret)
{
perror("msgrcv");
exit(1);
}
if(strncmp(buf.mbuf,"end",3) == 0)
{
kill(pid,SIGKILL);
break;
}
printf("\t\t%s\n",buf.mbuf);
}
waitpid(pid,NULL,0);
}
msgctl(msgid,IPC_RMID,NULL);
return 0;
}