Linux学习笔记-消息队列概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/86666251

目录

System V IPC概念

System V IPC对象的访问

举几个例子

IPC对象的权限和所有者结构体

消息队列

消息队列属性


System V IPC概念

Unix系统存在信号、管道和命令管道等基本进程间通讯机制。

System V引入了三种高级进程间通信机制:消息队列、共享内存、信号量;

IPC对象(消息队列、共享内存、信号量)存在于内核中而不是文件系统中,由用户控制释放(用户管理ipc对象的生命周期),不像管道的释放由内核控制。

IPC对象通过其标识符来引用和访问,所有IPC对象在内核空间中有唯一性标识ID,在用户控件中的唯一性标识称为key。

System V IPC对象的访问

IPC对象是全局对象:可用ipcs,ipcrm等命令查看或删除。

每个IPC对象都由get函数创建:

msgget,shmget,semget

调用get函数时必须指定关键字key

举几个例子

注意:管道是由内核控制,IPC是用户自己控制,所以要手动释放;

举个例子:ipcs和ipcrm命令:

由上可知:

通信有3种,如下:

1. Shared Memory Segments;

2. Semaphore Arrays;

3. Message Queues;

如果加-m是指memory,-q是Queues如下:

IPC对象的权限和所有者结构体

struct ipc_perm{

    uid_t uid;        //所有者的使用id
    gid_t gid;        //所有者的组
    uid_t cuid;        //创建者的id
    gid_t cgid;        //创建者的组
    mode_t mode;        //访问模块
    ...  
};

消息队列

1. 消息队列是内核中的一个链表;

2. 用户进程将数据传输到内核后,内核重写添加一些如用户ID、组ID、读写进程的ID和优先级等相关信息后并打成一个数据包称为消息;

3.运行一个或者多个进程往消息队列中写消息和读取消息,但一个消息只能被一个进程读取,读取完毕后就自动删除;

4.消息队列具有一定的FIFO的特性,消息可以按照顺序发送到队列中,也可以几种不同的方式从队列中读取。没一个消息队列在内核中用一个唯一的IPC消息表示ID表示;

5.消息队列到实现包括创建和打开队列、发送消息、读取消息、控制消息队列四种操作。

消息队列属性

struct msqid_ds{

    struct ipc_perm msg_perm;
    msgqnum_t msg_qnum;             //消息队列数量
    msglen_t msg_qbytes;            //队列的最大字节
    pid_t msg_lspid;                //最后发送的pid
    pid_t msg_lrpid;                //最后接收的pid
    time_t msg_stime;               //最后发送的时间
    time_t msg_ctime;               //最后改变的时间
};

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/86666251