文章目录
一.主要流程
1.ftok生成键值
2.msgget创建消息队列
3.msgsnd向队列里发送数据
4.msgrcv向队列里读取消息
5.msgctl删除消息队列
二.函数用法及参数
1. key_t ftok(const char *pathname, int proj_id); 生成键值
参数一:路径 参数二:任意值
2.int msgget(key_t key, int msgflg); 创建消息队列
参数一:key 参数二:一般为IPC_CREAT
3.int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数一:msgget返回的id值 参数二:发送的数据
参数三:发送数据的长度 参数四:一般为0
4.ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
参数一:msgget返回的id值 参数二:读到哪
参数三:读多长 参数四:消息类型 参数五:一般为0
5.int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数一:msgget返回的id值 参数二 一般为IPC_RMID 参数三:一般为NULL
三.例子
1.发送端
struct msgbuf
{
long mtype;
char mtext[128];
};
int main()
{
key_t key;
key = ftok(".",1);
struct msgbuf sendbuf = {888,"这个信息来自消息队列\n"};
int msgId = msgget(key,IPC_CREAT|0777);
if(msgId == -1){
printf("创建队列失败\n");
}
msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
printf("发送成功\n");
msgctl(msgId,IPC_RMID,NULL);
return 0;
}
2.接收端
int main()
{
key_t key;
key = ftok(".",1);
struct msgbuf readbuf;
int msgId = msgget(key,IPC_CREAT|0777);
if(msgId == -1){
printf("创建队列失败\n");
}
msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),888,0);
printf("从队列中读到了:%s\n",readbuf.mtext);
msgctl(msgId,IPC_RMID,NULL);
return 0;
}
3.结果