消息队列和共享内存、信号量一样,同属 System V IPC 通信机制。消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问。使用消息队列的好处是对每个消息指定了特定消息类型,接收消息的进程可以请求接收下一条消息,也可以请求接收下一条特定类型的消息。
相关数据结构
与其他两个 System V IPC 通信机制一样,消息队列也有一个与之对应的结构,该结构的定义如下:
struct msqid_ds
{
struct ipc_perm msq_perm;
struct msg *msg_first;
struct msg *msg_last;
ulong msg_ctypes;
ulong msg_qnum;
ulong msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
}
该结构中各个字段的说明如下。
msg_perm:对应于该消息队列的 ipc_perm 结构指针。
msg_first:msg 结构指针,msg 结构用于表示一个消息,此指针指向消息队列中的第一个消息。
msg_last:msg 结构指针,指向消息队列中的最后一个消息。
msg_ctypes:记录消息队列中当前的总字节数。
msg_qnum:记录消息队列中当前的总消息数。
msg_qbytes:记录消息队列中最大可容纳的字节数。
msg_lspid:最近一个执行 msgsnd 函数的进程的 PID。
msg_lrpid:最近一个执行 msgrcv 函数的进程的 PID。
msg_stime:最近一次执行 msgsnd 函数的时间。
msg_rtime:最近一次执行 msgrcv 函数的时间。
msg_ctime:最近一次改变该消息队列的时间。
消息队列所传递的消息由两部分组成,即消息的类型及所传递的数据。一般用一个结构体来表示。通常消息类型用一个正的长整数表示,而数据则根据需要设定。比如设定一个传递 1024 个字节长度的字符串数据的消息如下&