Unix IPC之Posix消息队列(2)

/* Query status and attributes of message queue MQDES.  */
extern int mq_getattr (mqd_t __mqdes, struct mq_attr *__mqstat)
  __THROW __nonnull ((2));

/* Set attributes associated with message queue MQDES and if OMQSTAT is
   not NULL also query its old attributes.  */
extern int mq_setattr (mqd_t __mqdes,
               __const struct mq_attr *__restrict __mqstat,
               struct mq_attr *__restrict __omqstat)
  __THROW __nonnull ((2));
struct mq_attr {
    long    mq_flags;    /* message queue flags            */
    long    mq_maxmsg;    /* maximum number of messages        */
    long    mq_msgsize;    /* maximum message size            */
    long    mq_curmsgs;    /* number of messages currently queued    */
    long    __reserved[4];    /* ignored for input, zeroed for output */
};

程序1(mqgetattr.c):获取一个消息队列的默认属性。(以大写开头的函数都是对应函数的包裹函数,仅仅在里面添加了出错信息)

// mqgetattr.c
#include    "unpipc.h"

int
main(int argc, char **argv)
{
    mqd_t    mqd;
    struct mq_attr    attr;

    if (argc != 2)
        err_quit("usage: mqgetattr <name>");

    mqd = Mq_open(argv[1], O_RDONLY);

    Mq_getattr(mqd, &attr);
    printf("max #msgs = %ld, max #bytes/msg = %ld, "
           "#currently on queue = %ld\n",
           attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);

    Mq_close(mqd);
    exit(0);
}

运行结果:

[[email protected] pxmsg]$ ./mqcreate1 /hello.1234
[[email protected] pxmsg]$ ./mqgetattr /hello.1234
max #msgs = 10, max #bytes/msg = 8192, #currently on queue = 0
[[email protected] pxmsg]$ 
[[email protected] pxmsg]$ ls -l /tmp/mqueue/hello.1234
-rw-r--r--. 1 dell dell 80 8月  12 21:03 /tmp/mqueue/hello.1234

即:80KB = 10 * 8192B

程序2:指定消息队列的最大消息个数及每个消息的最大长度。

#include    "unpipc.h"

struct mq_attr  attr;   /* mq_maxmsg and mq_msgsize both init to 0 */

int
main(int argc, char **argv)
{
    int     c, flags;
    mqd_t   mqd;

    flags = O_RDWR | O_CREAT;
    while ( (c = Getopt(argc, argv, "em:z:")) != -1)
    {
        switch (c)
        {
            case ‘e‘:
                flags |= O_EXCL;
                break;

            case ‘m‘:
                attr.mq_maxmsg = atol(optarg);
                break;

            case ‘z‘:
                attr.mq_msgsize = atol(optarg);
                break;
        }
    }
    if (optind != argc - 1)
        err_quit("usage: mqcreate [ -e ] [ -m maxmsg -z msgsize ] <name>");

    if ((attr.mq_maxmsg != 0 && attr.mq_msgsize == 0) ||
        (attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))
        err_quit("must specify both -m maxmsg and -z msgsize");

    mqd = Mq_open(argv[optind], flags, FILE_MODE,
                  (attr.mq_maxmsg != 0) ? &attr : NULL);

    Mq_close(mqd);
    exit(0);
}

运行结果:

[[email protected] pxmsg]$ cat /proc/sys/fs/mqueue/msg_max
10
[[email protected] pxmsg]$ cat /proc/sys/fs/mqueue/msgsize_max
8192
[[email protected] pxmsg]$ ./mqcreate -m 5 -z 512 /hello.123
[[email protected] pxmsg]$ ./mqgetattr /hello.123
max #msgs = 5, max #bytes/msg = 512, #currently on queue = 0
[[email protected] pxmsg]$ ls -l /tmp/mqueue/hello.123
-rw-r--r--. 1 dell dell 80 8月  12 21:26 /tmp/mqueue/hello.123
[[email protected] pxmsg]$ 

说明:这里设置时不能超过系统设定的参数。

时间: 2024-10-20 16:18:24

Unix IPC之Posix消息队列(2)的相关文章

Unix IPC之Posix消息队列(1)

部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/art/201006/207275.htm 消息队列可以认为是一个消息链表,某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到,这一点与管道和FIFO相反.Posix消息队列与System V消息队列的区别如下: 1. 对Posix消息队列的读总是返回最高优先级的最早消息,

Unix IPC之Posix消息队列(3)

struct mq_attr { long mq_flags; /* message queue flag : 0, O_NONBLOCK */ long mq_maxmsg; /* max number of messages allowed on queue*/ long mq_msgsize; /* max size of a message (in bytes)*/ long mq_curmsgs; /* number of messages currently on queue */

UNIX IPC: POSIX 消息队列 与 信号

POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <mqueue.h> #include

UNIX IPC: POSIX 消息队列

首先在我的MAC OSX上试了一下虽然有_POSIX_MESSAGE_PASSING的宏定义,但是用gcc编译会提示没有mqueue.h头文件,先放一边.在Ubuntu上使用正常,不过POSIX消息队列通过ipcs命令是看不到的,需要通过如下方式进行查看: mount -t mqueue none /mnt ls -al /mnt ls列出的文件即为程序中创建的POSIX消息队列,消息队列的名称需要以“/”开头否则会提示参数非法.通过cat查看这个文件可以知道这个队列的一些参数如: [email

Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

posix消息队列与system v消息队列的差别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则可以返回任意指定优先级的消息. (2)当往一个空队列放置一个消息时,posix消息队列允许产生一个信号或启动一个线程,system v消息队列则不提供类似机制. 队列中的每个消息具有如下属性: 1.一个无符号整数优先级(posix)或一个长整数类型(system v) 2.消息的数据部分长度(可以为0) 3.数据本身(如果长度大于0) Posix消息队

Linux IPC实践(7) --Posix消息队列

1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode constants */ #include <mqueue.h> mqd_t mq_open(const char *name, int oflag); //专用于打开一个消息队列 mqd_t mq_open(const char *name, int oflag, mode_t mode

Linux环境编程之IPC进程间通信(五):Posix消息队列1

对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的.而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每个消息都是一个记录,它由发送者赋予一个优先级.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后的某个时刻读出这些消息.这跟管道和FIFO不一样,当一个管道或FIFO的最后一次关闭时

细说linux IPC(九):posix消息队列

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 消息队列可以看作一系列消息组织成的链表,一个程序可以往这个链表添加消息,另外的程序可以从这个消息链表读走消息. mq_open()函数打开或创建一个posix消息队列. #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For mode cons

[转]Linux进程通信之POSIX消息队列

进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&utm_medium=referral 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点: 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相