- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux实验 消息队列
消息队列
消息队列存在于系统内核中每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同一般来说,实际开发过程中不会超过这个限制。有关函数msgget()、msgsnd()、msgrcv()、msgctl()。
1、msgget()
函数原型:
#includesys/msg.h
int msgget(key_t key,int msgflg);
功能:创建一个消息队列或取得一个已经存在的消息队列
返回值:成功返回消息队列的标示符(ID),失败为-1
参数:
key消息队列的键值,为IPC_PRIVATE创建一个只能被创建进程读写的消息队列不是IPC_PRIVATE则可指定个值,还可以用ftok函数来获得一个唯一的键值 ftok()函数其它文章msgflg:创建消息队列的创建方式或权限创建方式有:IPC_CREAT,如果内存则创建一个消息队列,否则取得
IPC_EXCL,消息队列存在时,新的消息队列才会被创建,否则会产生错误。
例:msgget()创建一个消息队列。
#includestdio.h
#includestdlib.h
#includesys/msg.h
#define MYMSG_KEY 75
int main()
{ int msgid;
msgid=msg(MYMSG_KEY,IPC_CREAT | 0644);
printf(msgid=%d\n,msgid);
if(msgid==-1){
perror(msgget error :);
exit(EXIT_FAILURE);
}
return 0;
}
运行结果如下:
可用ipcs -q 来查看是否创建成功用ipcrm –q msgidmsgsnd()
函数原型:
#includesys/msg.h
int msgsnd(int msgid,struct msgbuf *msgp ,int msgsz, int msgflg);
功能:往队列中发送一个消息。
返回值:成功返回0,失败返回-1;
参数:
sgid:消息识id也就是msgget()函数的返回值msgp:指向消息缓冲区的指针,该结构体为
struct mymesg {
long mtype; /*消息类型*/
char mtext[512]; /*消息*/
}
msgsz:消息的大小,不包含消息类型(4个字节)
msgflg可以设置为0或者IPC_NOWAIT如IPC_NOWAIT,则当消息队列已满,消息不写消息队列,控制将返回到进程如果没有指明,调用进程会被挂起,直到消息写到消息队列。
例:msgsnd()向指定消息队列发送消息。
#includestdio.h
#includestdlib.h
#includesys/msg.h
#includestring.h
#define MYMSG_KEY 75
struct mymesg {
long mtype; /* 消息类型*/
char mtext[512]; /* 消息文本*/
};
int main()
{ int msgid,msgsend_ret;
char buf[25];
struct mymesg msg_send;
msgid=msg(MYMSG_KEY,IPC_CREAT | 0644);
printf(msgid=%d\n,msgid);
if(msgid==-1){
perror(msgget error :);
exit(EXIT_FAILURE);
}
// write messages to msg queue
msg_send.mtype=1;
printf(enter a message:\n);
scanf(“%s”,buf); // 注意:输入字符串不能包含空格
strcpy(msg_send.mtext,buf);
msgsend_ret=msgsnd(msgid,msg_send,strlen(msg_send.mtext)+1,0);
if(msgsend_ret==-1){
perror(msgget error: );
exit(EXIT_FAILURE);
}
return 0;
}
运行结果:写入2个消息
通过命令“ipcs –q”,我们可以看到消息的数量为2既然向消息队列中写入了那么就可以读取消息队列中的消息了。msgrcv()
函数原型:
#includesys/msg.h
int msgrcv(int msgid , struct msgbuf *msgp,int msgsz , long mtype,int msgflg );
功能:从消息队列中读走消息是读走不是读取,读完之后没有了,这种机制类似于管道
返回值:成功返回0,失败返回-1;
参数:
msgid
您可能关注的文档
最近下载
- 职业技能大赛-电池制造工职业技能竞赛理论知识题库(附参考答案).docx
- 走近苏东坡ppt.ppt VIP
- 第1课时 水果店 课件 2025北师版数学三年级上册.ppt
- 2024年客户服务管理员(三级高级工)技能鉴定考试题库-上(单选、多选题汇总).docx VIP
- 失落的一角(精美版绘本).ppt VIP
- 1.1中华人民共和国成立前各种政治力量 课件(共25张ppt)(含音频+视频).pptx VIP
- 可能性(说课课件)四年级上册数学苏教版.ppt
- 计量器具、仪器日常使用点检表.xls VIP
- 食谱编制—食谱编制案例分析(食品营养与配餐课件).pptx VIP
- 2025上半年国内影视剧市场分析.pptx VIP
文档评论(0)