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;
}
原文地址:https://www.cnblogs.com/SunShine-gzw/p/13835843.html