资源描述:
《嵌入式Linux高级编程-04-3posix进程间通信》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式Linux高级编程linux进程间通信消息队列unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。分类目前主要有两种类型的消息队列:POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。键值消息队列的内核持续性要
2、求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必须提供该消息队列的键值。键值#include#includekey_tftok(char*pathname,charproj)功能:返回文件名对应的键值。pathname:文件名(已经创建)proj:项目名(不为0即可)打开/创建#include#include#includeintmsgget(key_tkey,intmsgflg)函数描述:建立消息队列key:
3、键值,由ftok获得。msgflg:标志位。返回值:与健值key相对应的消息队列描述字。msgflg表示权限以及消息队列的一些特性,有以下取值:IPC_CREATIPC_EXCL0666等等打开/创建IPC_CREAT创建新的消息队列IPC_EXCL与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。IPC_NOWAIT读写消息队列要求无法得到满足时,不阻塞。创建在以下两种情况下,将创建一个新的消息队列:如果没有与健值key相对应的消息队列,并且msgflg中包含了IPC_CREAT标志位。key参数为IPC_PRIVATE。创建in
4、topen_queue(key_tkeyval){intqid;if((qid=msgget(keyval,IPC_CREAT))==-1){return(-1);}return(qid);}发送消息#include#include#includeintmsgsnd(intmsqid,structmsgbuf*msgp,intmsgsz,intmsgflg)功能:向消息队列中发送一条消息。msqid:已打开的消息队列idmsgp:存放消息的结构msgsz:消息数据长度msgflg:发送标志
5、,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。消息格式structmsgbuf{longmtype;/*消息类型>0*/charmtext[1];/*消息数据的首地址*/};接收消息#include#include#includeintmsgrcv(intmsqid,structmsgbuf*msgp,intmsgsz,longmsgtyp,intmsgflg)功能:从msqid代表的消息队列中读取一个msgtyp类型
6、的消息,并把消息存储在msgp指向的msgbuf结构中。在成功地读取了一条消息以后,队列中的这条消息将被删除。msgctl(intmsqid,intcmd,struct*);CMD:IPC_SETIPC_STARIPC_RMID(移除消息对列)接收消息intread_message(intqid,longtype,structmsgbuf*qbuf){intresult,length;length=sizeof(structmsgbuf)-sizeof(long);if((result=msgrcv(qid,qbuf,length,type,0))==-1)
7、return(-1);return(result);}实例#include#include#include#include#includeintmain(){//生成keykey_tkey=ftok(“/tmp/3",1000);//创建消息队列intmsgid=msgget(key,IPC_CREAT
8、IPC_EXCL
9、0600);if(msgid<0)perror("error"),exit(-1);//发送消息char*msg="Helloworld!
10、";if(msgsnd(msgid,msg,strl