#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgget(key_t key, int msgflg); // 创建打开消息队列
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);
int msgctl(int msqid, int cmd, struct msqid_ds *buf); // 控制消息队列
msgctl一般用来释放消息队列中的内容:
msgctl(msgid,IPC_RMID,NULL);
ftok函数:
key_t ftok(const char *pathname, int proj_id);
key_t key;
key = ftok(".",1); //" . "表示当前文件
// 1 :id值,只能使用8bits(1-125)
消息队列通信原理:
- 消息队列是消息的链表,存放在内核中。一个消息队列由一个表示符(即队列ID)来标识。
- //消息队列以链表存储,所以其中每个消息都为结构体类型。
消息队列读取操作:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>//ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
// int msgflg);struct msgbuf {
long mtype; // 消息队列类型
char mtext[128]; // 内容
};int main()
{
struct msgbuf readbuf;int msgid = msgget(0x1234, IPC_CREAT|0777); // IPC_CREAT:当未找到相对应的key值时创建新的队列
if(msgid == -1){
printf("creat is fail\n");
}msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),888,0); // 888:队列类型。
//读取时必须用 sizeof 函数,因为readbuf.mtext中没有内容。
printf("read form que :%s\n",readbuf.mtext);struct msgbuf sendbuf = {988,"this is from read sososo"};
// 988: 消息队列类型。"this is from read sososo":内容。msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
return 0;
}
消息队列写入操作:
include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>// int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[128]; /* message data */
};
int main()
{
struct msgbuf sendbuf = {888,"this is from send"};int msgid = msgget(0x1234, IPC_CREAT|0777);
if(msgid == -1){
printf("creat is fail\n");
}msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
struct msgbuf readbuf;
msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),988,0);
printf("read form que :%s\n",readbuf.mtext);
return 0;
}