内容正文:
Q干锋教育
第6章System VIPC
·消息队列
·信号灯
·共享内存
目录
6.1
消息队列
口点击查看本)小节知识架构
6.2
共享内存
口点击查看本小节知识架构
6.3
信号灯
口点击查看本小节知识架构
学习目标
理解System V
掌握System V通
通信机的
信机制的特点
2
理解
掌握
及应用场合
熟练
掌握
熟练使用Sys
掌握System Vi通
V通信机制实
信机制编程接
3
现功能需求
口的方法
·第5章介绍了早期进程间通信机制。这些早期通信机制虽然便于操作,但有很大的
局限性,因此本章将介绍功能更加丰富的System V IPC。System V IPC在Linux
系统中占有很重要的位置,包括消息队列、共享内存、信号灯(信号量集)。其
使用接口较复杂,细节较多,读者应熟练掌握。
⨄知识架构
返回目录
6.1消息队列
6.1.1……………消息队列简介_
6.1.2……………消息队列编程
6.1.3……………。消息队列实验
6.1消息队列
6.1.1消息队列简介
Liux下的进程通信机制基本是从UNIX平台继承来的。对UNIX发展做出重大
贡献的两大主力AT&T的贝尔实验室及BSD在进程间通信方面的侧重点有所不
同。前者对UX早期的进程间通信手段进行了系统的改进和扩充,形成了
System V IPC,这些都是针对本地通信;后者则跳过该限制,形成了基于套
接字(socket)的进程间通信机制。
本节将介绍消息队列的使用。顾名思义,消息队列就是一些消息的列表,或者
说是一些消息组成的队列。消息队列与管道有些类似,消息队列可以认为是管
道的改进版。相较于管道的先进先出准则,消息队列在读取时可以按照消息的
类型进行读取,这也是消息队列的特点,它可以实现消息随机查询。消息发送
时,需要将消息封装,然后添加到队列的末尾即可;而消息接收时,则可以根
据需求进行选择的读取(读取即将封装的消息从队列中移除)。
6.1消息队列
6.1.1消息队列简介
·如图所示,进程可以通过消息队列添加消息,同时也可以从消息队列中读取消息,
它不同于无名管道的单向通信,操作更加灵活。
进程A
进程B
消息
消息
消息
消息
#include <sys/types.h>
#include <sys/ipc.h>
key t ftok(const char *pathname,int proj id);
ftok()函数被用来生成一个key值,key值可以被msgget(0函数、shmget0函
数、semget(0函数使用,参数pathname(路径名必须存在且可以自定义)
与proj id的低八位(可以自定义)共同产生一个key值。
6.1消息队列
6.1.1消息队列简介
·消息队列的实现包括创建或打开消息队列、添加消息、
读取消息和控制消息这四
个操作。
(1)创建或打开队列,创建的消息队列的数量会受到系统消息队列数量的限制。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key t key,int msgflg);
·参数ky为消息队列的键值,用来标志多个进程所访问的消息队列是否为同一个队
列。其值可以被设置为IPC PRIVATE或ftok(O函数的返回值。指定key为
IPC PRIVATE,内核保证创建一个新的、唯一的IPC对象,IPC标识符与内存中的
标识符不会冲突。IPC PRIVATE为宏定义,其值等于O。而一般情况下,ky值可
以选择通过ftok(0函数获取。
6.1消息队列
6.1.1消息队列简介
参数msgflg用来设置标志位属性,可以指定IPC CREAT,表示如果消息队列不存
在,则自动创建。也可以指定IPC EXCL,表示如果队列已存在,则返回错误码
EEXIST。同时msgflg必须还要指定权限,这一点与文件的mode权限一样。一般
情况下可以进行如下设置。
int msgget(key,IPC CREATIIPC EXCL10664);
上述设置表示,如果消息队列不存在,则自动创建;如果消息队列存在,则返回
错误码EEXIST,表示文件已存在,不需再创建,此时,函数的功能可以认为是创
建并打开一个消息队列。如果队列已存在,只需打开,则函数参数可以设置如下。
int msgget(key,0664):
msgget(0函数返回值为消息队列标识符,用于实现消息队列的发送、接收、控制。
6.1消息队列
6.1.1消息队列简介
(2)发送消息,即将消息添加到已经打开的消息队列的末尾。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/m