//头文件
#include
#include
#include
int msgget(key_t key, int msgflg);创建和访问一个消息。成功返回唯一的消息队列标识符,类似于进程id,失败返回-1。int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 将消息添加到消息队列中ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 从消息队列中获取消息struct msgbuf {long mtype; /* type of message */char mtext[1]; /* message text */
};
int msgctl(int msqid, int cmd, struct msqid_ds *buf); 是消息队列的控制函数,常用来删除消息队列。#include
#include
#include
#include
#include
#include
#include
#include
//自定义消息结构体
struct msgbuf
{long mtype;char buf[64];
};int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0666);//创建一个消息队列if(msgid == -1){ //创建失败的处理perror("msgget error");exit(-1);}struct msgbuf msg;memset(&msg,0,sizeof(struct msgbuf));if(fork()>0){ //父进程处理msg.mtype = 1;strcpy(msg.buf,"hello");msgsnd(msgid,&msg,sizeof(msg.buf),0); //将消息放入消息队列wait(NULL); //等待子进程结束msgctl(msgid,IPC_RMID,NULL); //删除消息队列exit(0);}else{ //子进程处理sleep(2); //让父进程有时间将消息放入消息队列msgrcv(msgid,&msg,sizeof(msg.buf),1,0); //从消息队列中取出消息puts(msg.buf); //打印取出的消息值exit(0);}return 0;
}
运行效果:

消息发送端源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER 255
struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT); //获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));msg.mtype = 1; //设置消息类型为2strncpy(msg.buffer,"hello",BUFFER);msgsnd(msgid,&msg,sizeof(msg.buffer),0); //想msgid的消息队列发送消息memset(&msg,0,sizeof(msg); //清空结构体msgrcv(msgid,&msg,sizeof(msg.buffer),2,0); //从msgid的消息队列接收消息printf("接收到的消息内容是:%s\n",msg.buffer);return 0;
}
消息接收端源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER 255struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT); //获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));while(1){msgrcv(msgid,&msg,sizeof(msg.buffer),1,0); //从msgid的消息队列接收消息,类型为1printf("接收端端收到的消息:%s\n",msg.buffer);msg.mtype = 2; //设置消息类型为2strncpy(msg.buffer,"world",BUFFER);msgsnd(msgid,&msg, sizeof(msg.buffer),0); //向msgid的消息队列发送消息if(sizeof(msg.buffer)!=0){break;}}return 0;
}
两个窗口运行结果:
