Linux系统中消息队列,共享内存、信号和线程高级操作
第十一章 消息队列
10.1消息队列定义
消息队列是消息的链表,存放在内存中,由内核维护
10.2 消息队列特点
消息队列的特点:
消息队列允许一个或多 个进程向它写入或者读取消息,并且每条消息都有类型。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。
与无名管道、有名管道一样,从消息队列中读出消息,消息队列中数据会被删除。同样消息队列中的消息是有格式的。只有内核重启或人工删除时,该消息才会被删除,若不人工删除消息队列,消息队列会一直存在于内存中
消息队列标识符,来标识消息队列。消息队列在整个系统中是唯一的。
Linux操作系统中消息队列限制值如下:
消息队列个数最多为16个
消息队列总容量最多为16384字节
每个消息内容最多为8192字节
System V提供的IPC通信机制需要一 个key值, 通过key值就可在系统内获得一 个唯一的消息队列ID。
10.3 key值
key值可以是人为指定的,也可以通过ftok函数获得。
#include <sys/types.h>
#include <sys/ipc.h>
key_ _t ftok(const char *pathname, int proj. _id);
功能:获得项目相关的唯一-的IPC键值。
◆参数:
➢pathname: 路径名
➢proj. _id: 项目ID,非0整数(只有低8位有效)
返回值:
➢成功返回key值
➢失败返回-1
10.4 创建消息队列
#include <sys/msg.h>
int msgget(key. _t key, int msgflg);
功能:创建一个新的或打开一个已经存在的消息队列。不同的进程调用此函数, 只要用相
同的key值就能得到同一个消息队列的ID。
参数:
➢key: IPC键值
➢msgflg: 标识函数的行为: IPC_ CREAT(创建)或IPC_ EXCL(如果已经存在则返回失败)。
返回值:
➢成功:消息队列的标识符
➢失败:返回-1
使用shell命令操作消息队列:
查看消息队列
ipcs-q
删除消息队列
ipcrm -q msqid
◆消息队列的消息的格式。
typedef struct . msg {
long mtype;
/*消息类型*/
char mtext[100];
/*消息正文*/ ../*消息的正文可以有多个成员*/ }MSG;
◆消息类型必须是长整型的,而且必须是结构体类型的第一个成员, 类型下面是消息正文,正文可以有多个成员(正文成员可以是任意数据类型的。
10.4.1 发送消息
发送消息:
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size. _t msgsz, int msgflg);
功能:将新消息添加到消息队列。
参数:
➢msqid: 消息队列的队列D。
➢msgp:待发送消息结构体的地址。
➢msgsz: 消息正文的字节数。
msgflg: 函数的控制属性
➢: msgsnd调用阻塞直到条件满足为止。
➢IPC_ NOWAIT:若消息没有立即发送则调用该函数的进程会立即返回。
返回值:
➢成功:0
➢失败:返回-1
10.4.2 接收消息
接收消息:
#include <sys/msg.h>
ssize_ t msgrcv(int msqid, void *msgp, size_ t msgsz, long msgtyp, int msgflg);
功能:从ID为msqid的消息队列中接收一 个消息。- - -旦接收消息成功,则消息在消息队列
中被删除。
参数:
➢msqid: 消息队列的ID,代表要从哪个消息列中获取消息。
➢msgp:存放消息结构体的地址。
➢msgsz: 消息正文的字节数。
msgtyp: 消息的类型、 可以有以下几种类型
msgtyp = 0:返回队列中的第一个消息
msgtyp > 0:返回队列中消息类型为msgtyp的消息
msgtyp < 0:返回队列中消息类型值小于或等于msgtyp绝对值的消息,如果这种消息有若干个,则取类型值最小的消息。
注意:若消息队列中有多种类型的消息, msgrcv获取消息的时候按消息类型获取,不是先
进先出的。在获取某类型消息的时, 若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原则。
msgflg:函数的控制属性
: msgrcv调用阻塞直到接收消息成功为止。
MSG NOERROR:若返回的消息字节数比nbytes字节数多,则消息就会截短到nbytes字节,且不通知消息发送进程。
IPC_ NOWAIT:调用进程会立即返回。若没有收到消息则立即返回-1。
返回值:
➢成功返回读取消息的长度
➢失败返回-1
10.4.3 消息队列的控制
#include <sys/msg.h>
int msgct(int msqid, int cmd, struct msqid. _ds *buf);
功能:对消息队列进行各种控制,如修改消息队列的属性,或删除消息消息队列。
参数:
msqid:消息队列的ID
cmd:函数功能的控制
buf: msqid_ ds数据类型的地址,用来存放或更改消息队列的属性
cmd:函数功能的控制
IPC_ RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关数据结构。
IPC STAT:将msqid相关的数据结构中各个元素的当前值存入到由buf指向的结构中。
IPC SET:将msqid相关的数据结构中的元素设置为由buf指向的结构中的对应值。
返回值:
➢成功:返回0
➢失败:返回-1
例: 01_ message_ queue. write.c 01 message_ queue_ read.c
第十二章 共享内存
12.1 共享内存概述
共享内存允许两个或者多个进程共享给定的存储区域。
共享内存是进程间共享数据的一种最快的方法,-个进程向共享的内存区域写入了数据,
共享这个内存区域的所有进程就可以立刻看到其中的内容。
使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。若-一个进程正在向
共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。

在Linux操作系统中共享内存限制值如下
共享存储段的最大字节数: 33554432
共享存储段的最小字节数: 1
系统中共享存储段的最大段数: 4096
每个进程共享存储段的最大段数: 4096
12.2获得一个共享存储标识符
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key. _t key, size. _t size,intshmflg);
功能

本文深入讲解了Linux系统中的进程间通信(IPC)机制,包括消息队列、共享内存、信号和线程等高级操作。详细介绍了各机制的工作原理、特点及应用场景。
最低0.47元/天 解锁文章
1283

被折叠的 条评论
为什么被折叠?



