随进程持续:IPC对象一直存在直到最后一个进程关闭该对象为止(管道和FIFO)。

随内核持续:IPC对象存在一直到内核自举(系统重新启动)或者显示删除该对象。

如System V消息队列,System V信号量,System V共享内存是随内核持续的。

随文件系统持续:IPC对象一直存在到显式该对象。

Posix消息队列,信号量和共享内存至少是随内核持续的,但是如果使用映射文件实现的,那就是随文件系统持续的。

消息队列概述

消息队列可以认为是一个消息链表,可以向消息队列发送消息和读取消息。

消息赋予一个优先级,Posix读一个消息队列总是返回最高优先级的最早消息,System V消息队列读可以返回任意指定优先级的消息。

当往一个空队列放置一个消息时,Posix消息队列允许产生一个信号或者启动一个线程(Posix消息队列不提供这种机制。)

进程通信(5):POSIX消息队列_操作系统

mq_open创建一个新的消息队列或者打开一个已存在的消息队列。

进程通信(5):POSIX消息队列_System_02

可能是某个文件系统中的真正路径名,也可能不是。

oflag可以设置只读,只写或者读写,或者非阻塞。

函数返回消息队列描述符,不一定是文件描述符。

mq_close关闭一个消息队列。

进程通信(5):POSIX消息队列_消息队列_03

每个消息队列都有一个保存其当前打开着描述符的引用计数器,因而函数能够实现类似Unlink的功能。mq_unlink将消息队列引用计数减1。

mq_send和mq_receive函数向队列中放置一个消息,从队列中取走一个消息。

每个消息由一个优先级,返回时总是返回最高优先级的最早消息。

Posix消息队列和System V消息队列都不具备向接受者准备标识消息发送者。

消息队列限制

进程通信(5):POSIX消息队列_操作系统_04

POSIX消息队列的异步事件通知:mq_notify

需要有一种方法通知何时有一个消息放置到了先前为空的对列,这样可以避免线程阻塞在读取函数。

POSIX消息队列允许异步事件通知,有两种选择

(1)产生一个信号给打开消息队列的进程。

(2)创建一个线程执行指定的函数

进程通信(5):POSIX消息队列_消息队列_05

进程通信(5):POSIX消息队列_System_06

进程通信(5):POSIX消息队列_System_07

sigev_notify为SIGEV_SIGNAL时,当有信息放置到空消息时,发送一个信号。

sigev_notify为SIGEV_THREAD时,当有信心放置到空消息时,启动一个新线程。

待。