Hulk

愚公移山

Posix消息队列

概述

消息队列可看做消息链表,线程可在队列中进行消息读写。

在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。

一个进程可以往某个队列写入一些消息,然后终止,再让另一个进程在以后某个时刻读取这些消息。而管道或FIFO的最后一次关闭发生时,仍在该管道或FIFO上的数据将被清除。


posix消息队列特点

对posix消息队列的读总是返回最高优先级的最早消息。

当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或者启动一个线程。


队列中的每个消息具有如下属性:

优先级

消息的数据部分长度

数据本身


消息队列的布局:



mq_open mq_close mq_unlink函数

mq_open 函数创建一个新的消息队列或者打开一个应存在的消息队列。

#include <mqueue.h>

mqd_t mq_open(const char *name,int oflag,.../*mode_t mode,struct mq_attr *attr    */);

name:posix IPC 名字,可能是某个文件系统中一个真正的路径名,也可能不是。

oflag参数:O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_EXCEL,O_NONBLOCK

mode:该参数在当创建一个新队列时需要。

常值说明

S_IRUSR

S_IWUSR

用户(属主)读

用户(属主)写

S_IRGRP

S_IWGRP

(属)组成员读

(属)组成员写

S_IROTH

S_IWOTH

其他用户读

其他用户写


attr:该参数在当创建一个新队列时需要。用于给新队列指定某些属性,若为空指针,则为默认属性。

mq_open返回值:消息队列描述符。


已打开的消息队列由mq_close关闭

#include <mqueue.h>
int mq_close(mqd_t mqdes);

从系统中删除用作mq_open第一个参数的某个name,使用mq_unlink

#include <mqueue.h>
int mq_unlink(const char *name);
posix消息队列至少具备随内核持续性,即使当前没有进程打开某个消息队列,该队列及其上的各个消息也将一直存在,直到调用mq_unlink并让它的引用计数达到0以删除该队列为止。


程序例子
int main(int argc,char *argv[])

{

    int c,flags;

    mqd_t mqd;

    flags = O_RDWR | O_CREAT;

    while((c= getopt(argc,argv,"e"))  != -1)

    {

        switch(c)

        {

            case 'e':

                flags |= O_EXCL;//若有-e存在。表示需要独占打开

                break; 

        }

    }

    if (optind != argc -1)

        printf("usage : mqcreate [-e]  <name>\n");

        mqd = mq_open(argv[optind],flags,FILE_MODE,NULL);//命令行输入IPC名字

        mq_close(mqd);//关闭

        exit(0);

}



从系统中删除消息队列:

int main(int argc,char *argv[])

{

    if (argc != 2)

        printf("usage: mqunlink <name>\n");

    mq_unlink(argv[1]);//命令行输入需要删除的消息队列名字。

}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Posix消息队列

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭