• Linux系统编程17_消息队列


    消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。

    消息队列可以认为是一个链表。进程(线程)可以往里写消息,也可以从里面取出消息。

    消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。

    消息队列是消息的链接表,存放在内核中。

    一个消息队列由一个标识符(即队列ID)来标识。独立于进程而存在的,在系统内存中,有内核管理的。

    ===========================================================================

    一个进程可以往某个消息队列里写消息,然后终止,

    另一个进程随时可以从消息队列里取走这些消息。

    这里也说明了,消息队列具有随内核的持续性,也就是系统不重启,消息队列永久存在。

    消息队列的名字只能以一个 ‘/‘开头,名字中不能包含其他的’/’

    ===========================================================================

    相关函数:

    //打开或创建一个消息队列
    mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);
    //参数
    //name 消息队列的名字
    //oflag 打开的方式,可读可写之类的
    //mode 可选参数,访问的权限
    //attr 用于给队列设置属性
    //返回值
    //mqd_t 消息队列描述符


    //关闭一个消息队列
    mqd_t mq_close(mqd_t mqdes);
    //和文件的close类型,关闭后,消息队列并不从系统中删除。一个进程结束,会自动调用关闭打开着的消息队列。

    //删除一个消息队列
    mqd_t mq_unlink(const char *name);
    //消息队列创建后只有通过调用该函数或者是内核自举才能进行删除。
    //每个消息队列都有一个保存当前打开着描述符数的引用计数器,和文件一样,因此本函数能够实现类似于unlink函数删除一个文件的机制。

    mq_attr  //POSIX消息队列的属性 
    long mq_flags //消息队列的标志:0或O_NONBLOCK,用来表示是否阻塞
    long mq_maxmsg //消息队列的最大消息数
    long mq_msgsize //消息队列中每个消息的最大字节数
    long mq_curmsgs //消息队列中当前的消息数目

    mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);
    //mq_getattr用于获取当前消息队列的属性,mq_setattr用于设置当前消息队列的属性。其中mq_setattr中的oldattr用于保存修改前的消息队列的属性,可以为空。

    mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr);
    //mq_setattr可以设置的属性只有mq_flags,用来设置或清除消息队列的非阻塞标志。newattr结构的其他属性被忽略。
    //mq_maxmsg和mq_msgsize属性只能在创建消息队列时通过mq_open来设置。mq_open只会设置该两个属性,忽略另外两个属性。
    //mq_curmsgs属性只能被获取而不能被设置。

    POSIX消息队列的使用
    mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio);
    //成功返回0,出错返回-1
    mqdes:消息队列描述符;
    msg_ptr:指向消息体缓冲区的指针;
    msg_len:消息体的长度,其中mq_receive的该参数不能小于能写入队列中消息的最大大小,即一定要大于等于该队列的mq_attr结构中mq_msgsize的大小。如果mq_receive中的msg_len小于该值,就会返回EMSGSIZE错误。POXIS消息队列发送的消息长度可以为0。
    msg_prio:消息的优先级;它是一个小于MQ_PRIO_MAX的数,数值越大,优先级越高。POSIX消息队列在调用mq_receive时总是返回队列中最高优先级的最早消息。如果消息不需要设定优先级,那么可以在mq_send是置msg_prio为0,mq_receive的msg_prio置为NULL。


    mqd_t mq_receive(mqd_t mqdes, char *msg_ptr,size_t msg_len, unsigned *msg_prio);
    //成功返回接收到消息的字节数,出错返回-1


    POSIX消息队列的限制:
    POSIX消息队列本身的限制就是mq_attr中的mq_maxmsg和mq_msgsize,分别用于限定消息队列中的最大消息数和每个消息的最大字节数。
    在前面已经说过了,这两个参数可以在调用mq_open创建一个消息队列的时候设定。当这个设定是受到系统内核限制的。

    ===========================================================================

    参考链接:

    POSIX 消息队列函数(mq_open、mq_getattr、mq_send、mq_receive)示例:https://blog.csdn.net/mayue_web/article/details/92712163

    知行合一
  • 相关阅读:
    BZOJ2002 [HNOI2010] 弹飞绵羊
    BZOJ1030 [JSOI2007] 文本生成器
    BZOJ3233 [AHOI2013] 找硬币
    BZOJ4269 再见xor
    BZOJ5297 CQOI2018 社交网络
    LOJ149 0/1分数规划
    BZOJ2132 圈地计划
    UOJ131 [NOI2015] 品酒大会
    composer速度慢(composer更换国内镜像)
    thinkphp6安装报错,composer install tp6 报错 Parse error: syntax error
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14660334.html
Copyright © 2020-2023  润新知