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\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;
}

 

posted @ 2020-10-18 16:29  sunshine_gzw  阅读(102)  评论(0编辑  收藏  举报