zoukankan      html  css  js  c++  java
  • IPC通信:Posix消息队列的属性设置

    Posix消息队列的属性使用如下结构存放:
    struct mq_attr  
    {  
        long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/ 
        long mq_maxmsg; /*队列所允许的最大消息条数*/ 
        long mq_msgsize; /*每条消息的最大字节数*/ 
        long mq_curmsgs; /*队列当前的消息条数*/ 
    }; 
    队列可以在创建时由mq_open()函数的第四个参数指定mq_maxmsg,mq_msgsize。 如创建时没有指定则使用默认值,一旦创建,则不可再改变。
    队列可以在创建后由mq_setattr()函数设置mq_flags 
    
    #include <mqueue.h>  
    
    /*取得消息队列属性,放到mqstat地fh*/ 
    int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat);  
    
    /*设置消息队列属性,设置值由mqstat提供,原先值写入omqstat*/ 
    int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat);  
    
    均返回:若成功则为0,若出错为-1 

    程序获取和设置消息队列的默认属性:

     1 #include <stdio.h>  
     2 #include <stdlib.h>  
     3 #include <mqueue.h>  
     4 #include <sys/types.h>  
     5 #include <sys/stat.h>  
     6 #include <unistd.h>  
     7 #include <fcntl.h>  
     8 #include <errno.h>  
     9    
    10 #define MQ_NAME ("/tmp")  
    11 #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag  
    12 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限  
    13    
    14 int main()  
    15 {  
    16     mqd_t posixmq;  
    17     int rc = 0;  
    18    
    19     struct mq_attr mqattr;  
    20    
    21     // 创建默认属性的消息队列  
    22     posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);  
    23     if(-1 == posixmq)  
    24     {  
    25         perror("创建MQ失败");  
    26         exit(1);  
    27     }  
    28        
    29     // 获取消息队列的默认属性  
    30     rc = mq_getattr(posixmq, &mqattr);  
    31     if(-1 == rc)  
    32     {  
    33         perror("获取消息队列属性失败");  
    34         exit(1);  
    35     }  
    36 
    37     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);  
    38     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);  
    39     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);  
    40     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);  
    41    
    42     rc = mq_close(posixmq);  
    43     if(0 != rc)  
    44     {  
    45         perror("关闭失败");  
    46         exit(1);  
    47     }  
    48    
    49     rc = mq_unlink(MQ_NAME);  
    50     if(0 != rc)  
    51     {  
    52         perror("删除失败");  
    53         exit(1);  
    54     }     
    55     return 0;  
    56 } 

    编译并执行:

    1 root@linux:/mnt/hgfs/C_libary# gcc -o attrmq attrmq.c -lrt
    2 root@linux:/mnt/hgfs/C_libary# ./attrmq
    3 队列阻塞标志位:0
    4 队列允许最大消息数:10
    5 队列消息最大字节数:8192
    6 队列当前消息条数:0
    7 root@linux:/mnt/hgfs/C_libary# 

    设置消息队列的属性:

     1 #include <stdio.h>  
     2 #include <stdlib.h>  
     3 #include <mqueue.h>  
     4 #include <sys/types.h>  
     5 #include <sys/stat.h>  
     6 #include <unistd.h>  
     7 #include <fcntl.h>  
     8 #include <errno.h>  
     9    
    10 #define MQ_NAME ("/tmp")  
    11 #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag  
    12 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限  
    13    
    14 int main()  
    15 {  
    16     mqd_t posixmq;  
    17     int rc = 0;  
    18    
    19     struct mq_attr mqattr;  
    20   
    21     // 创建默认属性的消息队列  
    22     mqattr.mq_maxmsg = 5; // 注意不能超过系统最大限制  
    23     mqattr.mq_msgsize = 8192;  
    24     //posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, NULL);  
    25     posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr);  
    26 
    27     if(-1 == posixmq)  
    28     {  
    29         perror("创建MQ失败");  
    30         exit(1);  
    31     }  
    32     
    33     mqattr.mq_flags = 0;  
    34     mq_setattr(posixmq, &mqattr, NULL);// mq_setattr()只关注mq_flags,adw  
    35        
    36     // 获取消息队列的属性  
    37     rc = mq_getattr(posixmq, &mqattr);  
    38     if(-1 == rc)  
    39     {  
    40         perror("获取消息队列属性失败");  
    41         exit(1);  
    42     }  
    43 
    44     printf("队列阻塞标志位:%ld\n", mqattr.mq_flags);  
    45     printf("队列允许最大消息数:%ld\n", mqattr.mq_maxmsg);  
    46     printf("队列消息最大字节数:%ld\n", mqattr.mq_msgsize);  
    47     printf("队列当前消息条数:%ld\n", mqattr.mq_curmsgs);  
    48    
    49     rc = mq_close(posixmq);  
    50     if(0 != rc)  
    51     {  
    52         perror("关闭失败");  
    53         exit(1);  
    54     }    
    55 
    56     rc = mq_unlink(MQ_NAME);  
    57     if(0 != rc)  
    58     {  
    59         perror("删除失败");  
    60         exit(1);  
    61     }
    62          
    63     return 0;  
    64 } 

    编译运行:

    1 root@linux:/mnt/hgfs/C_libary# gcc -o setattrmq setattrmq.c -lrt
    2 root@linux:/mnt/hgfs/C_libary# ./setattrmq
    3 队列阻塞标志位:0
    4 队列允许最大消息数:5
    5 队列消息最大字节数:8192
    6 队列当前消息条数:0

     

     

     

  • 相关阅读:
    第四次作业
    第二次上机作业
    5.21上机作业
    第十一周课后作业
    第十一周上机练习
    第10周java作业
    第9次上级联系
    第8周作业
    第八周上机练习
    第七周作业
  • 原文地址:https://www.cnblogs.com/polestar/p/2451202.html
Copyright © 2011-2022 走看看