zoukankan      html  css  js  c++  java
  • POSIX之消息队列

    my_semqueue_send.c:

    #include<stdio.h>
    #include<errno.h>
    #include<mqueue.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    void p_error(const char* str)
    {
        perror(str);
        exit(1);
    }
    int main(int argc,char* argv[])
    {
        mqd_t mq=mq_open("/my_queue",O_WRONLY|O_CREAT,0666,NULL);
        //创建一个消息队列,默认保存在/dev/myqueuue,(为了跨平台可移植性的需要,加/)
        if(mq==-1)
        {
            p_error("mq_open failed");
        }
        printf("my_queue open success
    ");
        int i=0,ret;
        char buf[100]="我是消息队列,接下来我要发送消息了";
        while(1)
        {
        ret=mq_send(mq,buf,strlen(buf),0);
        //第三个参数表示优先级,为0则为系统默认设置
        if(ret==-1)
        {
            p_error("发送失败");
        }
        printf("发送成功
    ");
        sleep(1);
        }
    
        ret=mq_close(mq);
        if(ret==-1)
        {
            p_error("关闭信号量失败");
        }
        ret=mq_unlink("/my_queue");
        if(ret==-1)
        {
            p_error("删除信号失败");
        }
    
        return 0;
    }

    my_semqueue_receive.c:

    #include<stdio.h>
    #include<errno.h>
    #include<mqueue.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    void p_error(const char* str)
    {
        perror(str);
        exit(1);
    }
    int main(int argc,char* argv[])
    {
        mqd_t mq=mq_open("/my_queue",O_RDONLY,0666,NULL);
        //注意这里的第二个参数要为科=可读
        if(mq==-1)
        {
            p_error("mq_open failed");
        }
        printf("my_queue open success
    ");
        int i=0,ret;
        char *buf;
        unsigned int prio;
    
        ret=mq_getattr(mq,&attr);   //获取消息队列的属性
        
        if(ret<0)
        {
            p_error("获取消息队列属性失败");
        }
    
    printf("消息队列默认属性--------
    ");
    printf("阻塞方式(0:非阻塞.1:阻塞)%ld
    ",attr.mq_flags);
    printf("消息队列最大接受的消息条数:%ld
    ",attr.mq_maxmsg);
    printf("消息队列中每条消息最大字节数:%ld
    ",attr.mq_msgsize);
    printf("----------------------
    ");
    
    //根据消息队列中的消息条数动态分配内存
     buf=(char*)malloc(sizeof(attr.mq_msgsize));
    
     if(NULL==buf)
     {
         p_error("申请失败");
     }
        while(1)
        {
        ret=mq_receive(mq,buf,attr.mq_msgsize,&prio);
        //第三个参数的大小不能小于消息队列msgsize
    
        if(ret==-1)
        {
            p_error("接受失败");
        }
        
        printf("接收到%d个字节,缓冲区的数据为:%s
    ",ret,buf);
        sleep(1);
        }
    
        mq_close(mq);
        mq_unlink("/my_queue");
    
        return 0;
    }
  • 相关阅读:
    判断浏览器是pc端和移动
    高德谷歌地图切换成英文地图
    小程序修改默认的单选框复选框样式
    推荐系统| ① Movies概述
    推荐系统| ② 离线推荐&基于隐语义模型的协同过滤推荐
    数据结构与算法| 复杂度分析
    Flink| 运行架构
    机器学习| 高数-基础
    Flink| 概述| 配置安装
    推荐系统| 概述
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13835843.html
Copyright © 2011-2022 走看看