C语言消息队列
MsgQueue1.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#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 <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#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;
}
本文介绍了如何使用C语言实现基于消息队列的进程间通信。通过`msgget`创建消息队列,`msgsnd`发送消息,`msgrcv`接收消息,以及`msgctl`控制消息队列。两个示例程序展示了发送和接收进程的逻辑,当接收到特定字符串"end"时,通信结束。
927

被折叠的 条评论
为什么被折叠?



