linux - POSIX消息队列linux
问题描述
我正在尝试从发送方 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);
}
如何处理这个
解决方案
问题是你无条件地打电话mq_unlink
给发件人。这就是正在发生的事情:
- 接收方创建消息队列
- 接收者在其上侦听消息
- 接收器进入睡眠状态
- 发送方删除消息队列
- 发送者创建一个新的同名消息队列
- 发送者向新的消息队列发送消息
由于发送方将消息发送到的消息队列不是接收方正在侦听的队列,因此接收方显然没有收到消息。
推荐阅读
- dask-ml - Dask ML 不会连接到远程集群
- java - 可以使用 Spring JPA 设置“set nocount on”
- c# - 当存在大量行时,OpenXml 会创建损坏的 Excel
- javascript - Login page go directly to cache because of cookies
- excel - Importing Categorizes emails from Outlook to Excel
- vb.net - DataGridView checkbox isn't showing checked on first item
- mongodb - Compare only a subset of the fields in MongoDB
- c - 为什么 strlen() 可以在 C 中获取字符串的长度而 sizeof 不能?
- firebase - 在 firebase 项目中实现动态子域的最佳方法是什么?
- r - R中有没有办法填补缺少观察的缺失组?