mq_getattr

NAME

mq_getattr - 获取消息队列的属性(REALTIME)

SYNOPSIS 

#include <mqueue.h>

int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);

  

Date Structure

An mq_attr structure shall have at least the following fields:

struct mq_attr {
               long mq_flags;       /* Flags: 0 or O_NONBLOCK */
               long mq_maxmsg;      /* Max. # of messages on queue */
               long mq_msgsize;     /* Max. message size (bytes) */
               long mq_curmsgs;     /* # of messages currently in queue */
           };

 

DESCRIPTION

函数 mq_getattr() 能够获取消息队列的属性,取得的结果存放在参数 mqstat 指针指向的内存.

消息队列的4种属性如下:

mq_flags

  该属性会在函数mq_open(3) 创建消息队列时被初始化. 他只有2个值O_NONBLOCK(非阻塞)和 0 (阻塞).

mq_maxmsg

  消息队列中最多能容纳的消息个数.

mq_msgsize

  每个消息的最大字节数.

mq_curmsgs
当前消息队列中正在排队的消息个数.

PARAMETERS

mqdes

消息队列的描述符

mqstat

指向消息队列属性结构体的指针

  

RETURN VALUE

如果函数执行成功, 函数返回0

如果函数执行失败,函数返回 -1 并且设置errno,errno的种别详见下面的ERRORS一节.

 

ERRORS

[EBADF]

参数 mqdes 不是有效的消息队列描述符.

 

EXAMPLES

 

 

转载于:https://www.cnblogs.com/LubinLew/p/POSIX-mq_getattr.html

#include <stdio.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <memory.h> #include <pthread.h> #include <mqueue.h> #define MSGLENGTH 5 #define MSG "hello" static void* send_task(void* argc) { printf("in send_task\n"); mqd_t mqd0, mqd1; struct mq_attr attr; size_t msg_len = 0; int msg_prio = 1; void *recv_buff = NULL; /* 打开消息队列,并获取其属性,分配读缓冲区 */ mqd0 = mq_open("/mqueue_demo0", O_CREAT|O_WRONLY, 0, NULL); mqd1 = mq_open("/mqueue_demo1", O_CREAT|O_RDONLY, 0, NULL); mq_getattr(mqd1, &attr); recv_buff = malloc(attr.mq_msgsize); /* 发送消息 */ mq_send(mqd0, MSG, MSGLENGTH, msg_prio); /* 接收消息 并打印 */ msg_len = mq_receive(mqd1, recv_buff, attr.mq_msgsize, &msg_prio); printf("send_task: msg[%s] msg_length[%d] msg_prio[%d]\n", (char*)recv_buff, msg_len, msg_prio); return NULL; } static void* receive_task(void* argc) { printf("in receive_task\n"); mqd_t mqd0, mqd1; struct mq_attr attr; void *buff = NULL; char msg[10] = {0}; ssize_t msg_len = 0; int msg_prio = 0; /* 打开消息队列,并获取其属性,分配读缓冲区 */ mqd0 = mq_open("/mqueue_demo0", O_RDONLY); mq_getattr(mqd0, &attr); buff = malloc(attr.mq_msgsize); mqd1 = mq_open("/mqueue_demo1", O_WRONLY); /* 接收消息 */ msg_len = mq_receive(mqd0, buff, attr.mq_msgsize, &msg_prio); printf("receive_task: msg[%s] msg_length[%d] msg_prio[%d]\n", (char*)buff, msg_len, msg_prio); /* 验证消息 */ if(strcmp(buff, MSG)==0) { strcpy(msg, "OK"); } else { strcpy(msg, "ERROR"); } /* 发送响应消息 */ mq_send(mqd1, msg, 10, 2); return NULL; } int mqueue_demo(void) { pthread_t tid_send, tid_receive; /* 创建消费者任务 */ pthread_create(&tid_send, NULL, send_task, NULL); pthread_create(&tid_receive, NULL, receive_task, NULL); pthread_join(tid_send, NULL); pthread_join(tid_receive, NULL); return 0; }
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值