POSIX消息队列Linux

时间:2018-10-12 06:42:54

标签: linux posix message-queue

我正在尝试从发送方mq_sender()接收mq_receive()数据,当我以前首先运行发送文件时它可以工作..但是,如果我先运行接收,即使将数据发送到队列后它也会阻塞..i在

下方附加了我的代码
    //sender
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<mqueue.h>
#include<string.h>
#include<unistd.h>
#define NAME "/queone"
#define MAX_SIZE 1021
void main()
{
        int i;
        struct mq_attr attr;
        attr.mq_maxmsg = 10;
        attr.mq_msgsize = MAX_SIZE;
        int fd;
        char s[MAX_SIZE]="hello";
        int r1,r2;


                mq_unlink(NAME);
                perror("mq_unlink");
                fd=mq_open(NAME,O_CREAT | O_WRONLY ,0664,&attr);
                printf("fd=%d\n",fd);
                for(i=0;i<5;i++)
                r1=mq_send(fd,s,sizeof(s),0);
                printf("%d",r1);
}
//receiver
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<mqueue.h>
#include<string.h>
#include<unistd.h>
#define NAME "/queone"
#define MAX_SIZE 1021
void main()
{
        struct mq_attr attr;
        attr.mq_maxmsg = 10;
        attr.mq_msgsize = MAX_SIZE;

        int fd,fd1,r;
        char s[MAX_SIZE];
                fd=mq_open(NAME,O_CREAT|O_RDONLY ,0664,&attr);
                perror("mq_open");
                printf("fd=%d\n",fd);
                mq_getattr(fd,&attr);
                printf("%d\n",attr.mq_curmsgs);
                printf("%d\n",attr.mq_msgsize);

                r=mq_receive(fd,s,sizeof(s),0);
                printf("%d",r);
                if(r==-1)
                perror("mq_receive");
                printf("%s\n",s);
                mq_unlink(NAME);


        }

如何处理

1 个答案:

答案 0 :(得分:1)

问题是您无条件地在发件人中呼叫ModelMapper mapper = new ModelMapper(); mapper.createTypeMap(DTO.class, Entity.class) .addMappings(mapping -> mapping.<Set<String>>map(DTO::getProp, (dest, v) -> dest.getNested().setProp(v))); mapper.createTypeMap(Entity.class, DTO.class) .addMappings(mapping -> mapping.map(src -> src.getNested().getProp(), DTO::setProp)); 。因此,这是正在发生的事情:

  1. 接收方创建一个消息队列
  2. 接收方在其上收听消息
  3. 接收器进入睡眠状态
  4. 发件人删除邮件队列
  5. 发件人创建一个具有相同名称的新消息队列
  6. 发件人将消息发送到新消息队列

由于发送者向其发送消息的消息队列不是接收者正在侦听的消息队列,因此接收者显然没有收到该消息。