一、消息队列
(1) 消息队列是进程间通信的一种方式,遵循先进先出的原则,保证了时间的顺序性。拥有该消 息队列读权限的进程可以从消息队列读出数据,拥有该消息队列写权限的进程可以向消息队列发送数据。
(2)消息作为节点一个一个地存放在消息队列里,可把消息队列比作信箱,消息比作依次顺序存放的信件。地址比作消息类型,内容为消息。支持双向传输,可以使用消息类型区分不同的消息。,其实消息队列说白了就是用来存放消息的链表。
(3)消息队列不再局限于父子进程,在任何两个进程间都能通信。
重要提示:
消息队列是linux内核地址空间中的内部链表,通过Linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相互独立的,每个消息队列中的消息又构成一个独立的链表。
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型地数据结构。我们可以通过发送消息来避免命名管道地同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。
二、消息队列相关的API
1.msgget
函数
函数原型:
int msgget(key_t key, int msgflg);
作用:用来创建一个消息队列
参数:
key
:某个消息队列的名字
msgflg
:由九个权限标志构成,它们的⽤法和创建⽂件时使⽤的mode
模式标志是⼀样的
IPC_CREAT
//不存在创建,存在就打开
IPC_CREAT|EXCL
//不存在就创建,存在出错
返回值:成功返回一个非负整数(即该消息队列的标识码),失败返回-1
顺便说一下key
的生成
系统建立IPC通信时必须指定一个ID值,即关键字key
,key
由函数ftok
生成:
key_t ftok(const char *pathname, int proj_id);
//pathname就是你指定的文件名(路径),要求文件必须存在,一般使用当前目录,如:
key_t key;
key = ftok(".", 1);//这样就是将pathname设为当前目录
//id是子序号,虽然是int类型,但是只使用8bits(1-255)
//返回值:失败返回-1,成功返回key_t值
//proj_id可以是数字也可以是字符
2.msgsnd
函数
函数原型:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
作用:发送消息,即把一条消息添加到消息队列中去
参数:
msqid
:由msgget函数返回的消息队列标识码,表示往哪个消息队列发数据
msgp
:是⼀个指针,指针指向准备发送的消息(即准备发送的消息的内容)
msgsz
:消息的大小,即mtext的大小,即用strlen()
计算
msgflg
:0表示阻塞方式,IPC_NOWAIT
表⽰队列满不等待,返回EAGAIN
错误
返回值:成功返回0,失败返回-1
消息的结构参考:
struct msgbuf {
long mtype; /* message type, must be > 0 */