linux下的消息队列编程

linux下的消息队列编程

ID:8803655

大小:20.67 KB

页数:8页

时间:2018-04-08

linux下的消息队列编程_第1页
linux下的消息队列编程_第2页
linux下的消息队列编程_第3页
linux下的消息队列编程_第4页
linux下的消息队列编程_第5页
资源描述:

《linux下的消息队列编程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Linux下的消息队列的使用SUNNY.MAN一、消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中进程间通信机制之一。消息队列就是一个消息的链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。Linux采用消息队列的方式来实现消息传递。这种消息的发送方式是:发送方不必等待接收方检查它所收到的消息就可以继续工作下去,而接收方如果没有收到消息也不需等待。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列是随内

2、核持续的并和进程相关,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。因此系统中记录消息队列的数据结构(structipc_idsmsg_ids)位于内核中,系统中的所有消息队列都可以在结构msg_ids中中找到访问入口。IPC标识符:每一个IPC目标都有一个唯一的IPC标识符。这里所指的IPC目标是指一个单独的消息队列、一个信号量集或者一个共享的内存段。系统内核使用此标识符在系统内核中指明IPC目标。IPC关键字:想要获得唯一的标识符,则必须使用一个IPC关键字。客户端进程和服务器端进程必须双方都同意此关键字。这是建立一个客户机/服务器框架的第一步。一般情况下

3、,可以使用ftok()函数为客户端和服务器端产生关键字值。#include  #include  key_tftok(constchar*fname,intid)  fname就是你指定的文件名(已经存在的文件名),一般使用当前目录,如:  key_tkey;  key=ftok(".",1);这样就是将fname设为当前目录。id是子序号在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为

4、0x26,则最后的key_t返回值为0x26010002。查询文件索引节点号的方法是:ls-i当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分配,因此与原来不同,所以得到的索引节点号也不同。  如果要确保key_t值不变,要么确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值,比如:  #defineIPCKEY0x111  charpath[256];  sprintf(path,"%s/etc/config.ini",(char*)getenv("HOME"));  msgid=ftok(path,IPCKEY);也就是说其实ftok的作

5、用就是根据你所指定的文件的索引点号生成一个独一无二的KEY,并保持。不过在使用的过程中,一般都是直接指定一个固定的值,这样使用起来简单,但一定要确保和其它程序不冲突。二、使用消息队列查看一个系统中的消息可以用ipcs–q来查看,这可以看到msgid和权限以及当前有几条消息。当你在调试的过程中,由于程序没有正常结束,而你又想删除此消息时,请使用ipcrm–qmsgid命令。下面结合具体的实例代码详细说明一下使用的过程。Snd.c文件#include#include#include#include#includ

6、e#include#include#defineMAX_TEXT512#defineMSG_KEY335structmy_msg_st{longmy_msg_type;//这个就是消息的类型,在接收的时候一定要指定这个//类型才会接收到相应的消息。charsome_text[MAX_TEXT];};intmain(){inti=10;intrunning=1;structmy_msg_stsome_data;intmsgid;charbuffer[BUFSIZ];msgid=msgget((key_t)MSG_KEY

7、,IPC_CREAT

8、IPC_EXCL

9、S_IRUSR

10、S_IWUSR);//首先创建,如果不成功,就取得if(msgid==-1){printf("createfailegetimsgid");msgid=msgget((key_t)MSG_KEY,IPC_EXCL

11、S_IRUSR

12、S_IWUSR);}if(msgid==-1){fprintf(stderr,"msggetfailedwitherror:%d",errno);exit(EXIT_FAILUR

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。