进程间通信(二) 消息队列

本文详细介绍了Linux系统中的消息队列,对比了消息队列与管道的区别,如消息队列以数据块为单位传输,生命周期随内核,并支持并行读取。文章还探讨了消息队列的特性、系统接口,包括获取、控制和发送/接收消息的函数,并通过实例展示了如何使用消息队列实现进程间的通信。
摘要由CSDN通过智能技术生成

区别于管道

1.不同于管道面向字节流,它是以数据块为单位进行传送的(消息队列类似于网络通讯协议中的UDP,管道类似于TCP)
2.区别于管道生命进程随进程,消息队列的生命周期是随内核的
3.区别fifo管道的先进先出,消息队列读取是并行的

消息队列

消息队列是系统的ipc资源,
操作系统为每个ipc资源都统一维护了一个数据结构ipc_perm

struct ipc_perm
{
key_t        key;                        /*使用其标识ipc_perm资源*/
uid_t           uid;                      /*共享内存所有者的有效用户ID */
gid_t          gid;                       /* 共享内存所有者所属组的有效组ID*/ 
uid_t          cuid;                    /* 共享内存创建 者的有效用户ID*/
gid_t         cgid;                   /* 共享内存创建者所属组的有效组ID*/
unsigned short   mode;    /* Permissions + SHM_DEST和SHM_LOCKED标志*/
unsignedshort    seq;          /* 序列号*/
}; 

而对于消息队列的结构体mgqid_ds 也是具有上面的结构体的

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 */
};

可以看到看到消息队列的的结构体中第一个成员变量就是ipc_perm

同时从第二个和第三个成员变量可以看出 它有一个头指针和尾指针

可以猜想它存储消息的队列大概就是一个双向链表

还注意到这个指针是一个结构体 struct msg的指针 我们再看看这个结构体长啥样

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值