首页 > 其他 > 详细

POSIX之消息队列

时间:2020-10-18 17:41:46      阅读:42      评论:0      收藏:0      [点我收藏+]

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\n");
    int i=0,ret;
    char buf[100]="我是消息队列,接下来我要发送消息了";
    while(1)
    {
    ret=mq_send(mq,buf,strlen(buf),0);
    //第三个参数表示优先级,为0则为系统默认设置
    if(ret==-1)
    {
        p_error("发送失败");
    }
    printf("发送成功\n");
    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\n");
    int i=0,ret;
    char *buf;
    unsigned int prio;

    ret=mq_getattr(mq,&attr);   //获取消息队列的属性
    
    if(ret<0)
    {
        p_error("获取消息队列属性失败");
    }

printf("消息队列默认属性--------\n");
printf("阻塞方式(0:非阻塞.1:阻塞)%ld\n",attr.mq_flags);
printf("消息队列最大接受的消息条数:%ld\n",attr.mq_maxmsg);
printf("消息队列中每条消息最大字节数:%ld\n",attr.mq_msgsize);
printf("----------------------\n");

//根据消息队列中的消息条数动态分配内存
 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\n",ret,buf);
    sleep(1);
    }

    mq_close(mq);
    mq_unlink("/my_queue");

    return 0;
}

 

POSIX之消息队列

原文:https://www.cnblogs.com/SunShine-gzw/p/13835843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!