设为首页 收藏本站
查看: 625|回复: 0

[经验分享] linux 消息队列实例

[复制链接]
发表于 2018-5-22 12:48:01 | 显示全部楼层 |阅读模式
前言:消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息函数:1.创建新消息队列或取得已存在消息队列原型:int msgget(key_t key, int msgflg);参数:key:可以认为是一个端口号,也可以由函数ftok生成。msgflg:IPC_CREAT值,若没有该队列,则创建一个并返回新标识符;若已存在,则返回原标识符。   IPC_EXCL值,若没有该队列,则返回-1;若已存在,则返回0。2.向队列读/写消息原型:msgrcv从队列中取用消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);msgsnd将数据放到消息队列中:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);参数:msqid:消息队列的标识码msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下: struct msgstru{long mtype; //大于0char mtext[512];}; msgsz:消息的大小。msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。  msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。3.设置消息队列属性原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMIDIPC_STAT : 该命令用来获取消息队列对应的 msqid_ds 数据结构,并将其保存到 buf 指定的地址空间。IPC_SET : 该命令用来设置消息队列的属性,要设置的属性存储在buf中。     IPC_RMID : 从内核中删除 msqid 标识的消息队列。
/*send.c*/  
#include <stdio.h>   
#include <sys/types.h>   
#include <sys/ipc.h>   
#include <sys/msg.h>   
#include <errno.h>  
#define MSGKEY 1024   
struct msgstru  
{  
long msgtype;  
char msgtext[2048];   
};  
main()  
{  
struct msgstru msgs;  
int msg_type;  
char str[256];  
int ret_value;  
int msqid;  
msqid=msgget(MSGKEY,IPC_EXCL);  /*检查消息队列是否存在*/  
if(msqid < 0){  
msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/  
if(msqid <0){  
printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));  
exit(-1);  
}  
}   
while (1){  
printf("input message type(end:0):");  
scanf("%d",&msg_type);  
if (msg_type == 0)  
break;  
printf("input message to be sent:");  
scanf ("%s",str);  
msgs.msgtype = msg_type;  
strcpy(msgs.msgtext, str);  
/* 发送消息队列 */  
ret_value = msgsnd(msqid,&msgs,sizeof(struct msgstru),IPC_NOWAIT);  
if ( ret_value < 0 ) {  
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));  
exit(-1);  
}  
}  
msgctl(msqid,IPC_RMID,0); //删除消息队列   
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-479111-1-1.html 上篇帖子: Linux的特性 下篇帖子: 查看linux版本内核 Linux内核版本的变化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表