IPC之消息队列

本文介绍了IPC中的消息队列,强调了其避免命名管道同步和阻塞的优势。内容涵盖消息队列的限制(如msgmax,msgmnb,msgmni),结构(ipc_perm),创建与销毁的函数(msgget,ftok,msgctl),发送和接收消息的机制(msgsnd,msgrcv),以及示例代码片段。
摘要由CSDN通过智能技术生成

一、什么是消息队列
消息队列:
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值,我们可以通过发送消息来避免命名管道的同步和阻塞问题,所以消息队列是基于消息的,管道是基于字节流的。
消息队列和命名管道有一样的不足就是:每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI)。

msgmax,每个消息的最大长度是有上限的。
这里写图片描述

msgmnb,每个消息队列的最大字节数也是有上限的
这里写图片描述

msgmni,每个系统上可以存在多少个消息队列也有自己的限制
这里写图片描述

二、消息队列的结构
IPC是UNIX系统中进程间通信的统称,有三种称作XSI IPC:消息队列,信号量,共享内存。每创建这三种之间的任何一种,都相当于建立了一个XSI IPC对象。系统为每个IPC对象都维护了一种结构ipc_perm
这是消息队列的结构,在(/usr/include/linux)下有一个名为msg.h的头文件里。

struct msqid_ds {
  struct ipc_perm msg_perm;
  struct msg *msg_first;      /* first message on queue,unused  */
  struct msg *msg_last;       /* last message in queue,unused */
  __kernel_time_t msg_stime;  /* last msgsnd time */
  __kernel_time_t msg_rtime;  /* last msgrcv time */
  __kernel_time_t msg_ctime;  /* last change time */
  unsigned long  msg_lcbytes; /* Reuse junk fields for 32 bit */
  unsigned long  msg_lqbytes; /* ditto */
  unsigned short msg_cbytes;  /* current number of bytes on queue */
  unsigned short msg_qnum;    /* number of messages in queue */
  unsigned short msg_qbytes;  /* max number of bytes on queue */
  __kernel_ipc_pid_t msg_lspid;   /* pid of last msgsnd */
  __kernel_ipc_pid_t msg_lrpid;   /* last receive pid */

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值