收藏 分享(赏)

嵌入式Linux高级编程--04-3posix_进程间通信.ppt

上传人:dzzj200808 文档编号:3815772 上传时间:2018-11-19 格式:PPT 页数:17 大小:1.18MB
下载 相关 举报
嵌入式Linux高级编程--04-3posix_进程间通信.ppt_第1页
第1页 / 共17页
嵌入式Linux高级编程--04-3posix_进程间通信.ppt_第2页
第2页 / 共17页
嵌入式Linux高级编程--04-3posix_进程间通信.ppt_第3页
第3页 / 共17页
嵌入式Linux高级编程--04-3posix_进程间通信.ppt_第4页
第4页 / 共17页
嵌入式Linux高级编程--04-3posix_进程间通信.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、嵌入式Linux高级编程,linux进程间通信,消息队列,unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。 消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。,分类,目前主要有两种类型的消息队列: POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。 系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。,键值,消息队列的内核持续性要求每个消息队列都

2、在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必须提供该消息队列的键值。,键值,#include #include key_t ftok (char*pathname, char proj) 功能: 返回文件名对应的键值。 pathname:文件名(已经创建) proj:项目名(不为0即可),打开/创建,#include #include #include int msgget(key_t key, int msgflg) 函数描述:建立消息队列 key:键值,由ftok获得。 msgflg:标志位。 返回值:与健值key相对应的消息队列描述字。 msgflg表示权限以及消息队

3、列的一些特性,有以下取值:IPC_CREAT IPC_EXCL 0666 等等,打开/创建,IPC_CREAT 创建新的消息队列 IPC_EXCL 与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。 IPC_NOWAIT 读写消息队列要求无法得到满足时,不阻塞。,创建,在以下两种情况下,将创建一个新的消息队列:如果没有与健值key相对应的消息队列,并且msgflg中包含了IPC_CREAT标志位。key参数为IPC_PRIVATE。,创建,int open_queue(key_t keyval) intqid;if(qid=msgget(keyval,IPC_CREA

4、T)=-1)return(-1);return(qid); ,发送消息,#include #include #include int msgsnd(int msqid,struct msgbuf*msgp,int msgsz,int msgflg) 功能:向消息队列中发送一条消息。 msqid:已打开的消息队列id msgp:存放消息的结构 msgsz:消息数据长度 msgflg:发送标志,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。,消息格式,struct msgbuf long mtype; /* 消息类型 0 */c

5、har mtext1; /* 消息数据的首地址*/ ;,接收消息,#include #include #include int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg) 功能:从msqid代表的消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结构中。在成功地读取了一条消息以后,队列中的这条消息将被删除。 msgctl(int msqid,int cmd, struct *); CMD: IPC_SET IPC_STAR IPC_RMID(移除消息对列),

6、接收消息,int read_message(int qid,long type,struct msgbuf*qbuf) int result,length;length=sizeof(struct msgbuf)-sizeof(long);if(result=msgrcv(qid,qbuf,length,type,0)=-1)return(-1);return(result); ,实例,#include #include #include #include #include int main() /生成key key_t key = ftok(“/tmp/3“,1000); /创建消息队列 i

7、nt msgid = msgget(key,IPC_CREAT|IPC_EXCL|0600); if(msgid0)perror(“error“),exit(-1); /发送消息 char *msg = “Hello world!“; if(msgsnd(msgid,msg,strlen(msg),0)0)perror(“error“); ,实例,#include #include #include #include #include int main() key_t key = ftok(“/tmp/3“,1000); int msgid = msgget(key,0); if(msgid0)perror(“error“),exit(-1); char msg100=; if(msgrcv(msgid,msg,sizeof(msg),0,0)0)perror(“error“); printf(“msg:%sn“,msg); ,实例,私有消息队列 IPC_PRIVATE.c msg.c一个程序往消息队列里写 alarm或quit,另一个程序读,判断独到的如果是alarm则发信号给自己,让自己执行alarm(5),如果quit则给自己发信号退出程序,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > linux/Unix相关

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报