0
点赞
收藏
分享

微信扫一扫

消息队列通信

NicoalsNC 2022-03-11 阅读 38
linux

消息队列:消息队列就是一个消息的列表。用户可以从消息队列种添加消息、读取消息 等。

消息队列的实现包括:创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操 作。

我们在学习消息队列时有四个离不开也很重要的函数:

函数msgget:创建或打开消息队列,消息队列的数量会受到系统消 息队列数量的限制;

函数 msgsnd:把消息添加到已打开的消息队列 末尾;

函数 msgrcv:读取消息,消息从消息队列中取走,它可以指定取走某一条消息;

函数 msgctl:控制消息队列,它可以完成多项功能。

首先介绍msgget 函数语法要点:

msgsnd 函数语法要点:

msgrcv 函数语法要点:

msgrcv 函数语法要点:

 msgctl 函数语法要点:

 实例:

msg.c

源代码:

/*msg.c*/ 

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <sys/msg.h> 

#include <stdio.h> 

#include <stdlib.h> 

#include <unistd.h> 

#include <string.h> 

#define BUFSZ 512 

struct message{ 

 long msg_type; 

 char msg_text[BUFSZ]; 

}; 

int main() 

{ 

 int qid; 

 key_t key; 

 int len; 

 struct message msg; 

/*根据不同的路径和关键表示产生标准的 key*/ 

 if((key=ftok(".",'a'))== -1){ 

 perror("ftok"); 

 exit(1); 

 } 

/*创建消息队列*/ 

 if((qid=msgget(key,IPC_CREAT|0666))== -1){ 

 perror("msgget"); 

 exit(1); 

 } 

 printf("opened queue %d\n",qid); 

 puts("Please enter the message to queue:"); 

 if((fgets((&msg)->msg_text,BUFSZ,stdin))==NULL){ 

 puts("no message"); 

 exit(1); 

 } 

 msg.msg_type = getpid(); 

 len = strlen(msg.msg_text); 

/*添加消息到消息队列*/ 

 if((msgsnd(qid,&msg,len,0))<0){ 

 perror("message posted"); 

exit(1); 

 } 

/*读取消息队列*/ 

 if(msgrcv(qid,&msg,BUFSZ,0,0)<0){ 

 perror("msgrcv"); 

 exit(1); 

 } 

 printf("message is:%s\n",(&msg)->msg_text); 

/*从系统内核中移走消息队列。*/ 

 if((msgctl(qid,IPC_RMID,NULL))<0){ 

 perror("msgctl"); 

 exit(1); 

 } 

 exit(0); 

} 

​运行结果:

 运行结果:

 

 

举报

相关推荐

0 条评论