c - 读取posix消息队列时文件描述符错误
问题描述
存在类似的线程,但没有一个有帮助。在 linux 下使用以下代码阅读时出现错误的文件描述符错误。在使用 O_CREAT 标志进行创建时,我还指定了队列属性。任何想法?谢谢。
#include <stdio.h>
#include <mqueue.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#define Log(...) printf(__VA_ARGS__); fflush(stdout)
int error;
void* producer(void* arg) {
Log("producer\n");
mqd_t q = mq_open("/ytm", O_RDWR);
mq_send(q, "kardeshians", sizeof("kardeshians"), 1);
}
void* consumer(void* arg) {
Log("consumer\n");
char buff[32];
mqd_t q = mq_open("/ytm", O_RDONLY);
int prio;
while(1) {
error = mq_receive(q,buff,sizeof(buff), NULL);
if(error) {
printf("read error %d %s\n", errno, strerror(errno));
}
}
}
int main() {
struct mq_attr attr;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 32;
mqd_t queue = mq_open("/ytm", O_CREAT | O_RDWR, 0, &attr);
pthread_t tid;
pthread_create(&tid, 0 , producer, 0);
pthread_create(&tid, 0 , consumer, 0);
while(1);
}
解决方案
问题在于执行权限和消息大小。在以 root 身份运行并使读取缓冲区大小大于 mq_msgsize 之后,它就可以工作了。感谢您提供错误检查建议。这是工作代码:
#include <stdio.h>
#include <mqueue.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#define Log(...) printf(__VA_ARGS__); fflush(stdout)
int error;
void* producer(void* arg) {
Log("producer\n");
mqd_t q = mq_open("/ytm", O_RDWR);
if(q == -1) {
printf("mq_open error %d %s\n", errno, strerror(errno));
exit(0);
}
while(1) {
int retval = mq_send(q, "kardeshians\n", sizeof("kardeshians\n"), 1);
if(retval == -1) {
printf("mq_open error %d %s\n", errno, strerror(errno));
exit(0);
}
}
}
void* consumer(void* arg) {
Log("consumer\n");
char buff[64];
mqd_t q = mq_open("/ytm", O_RDONLY);
int prio;
while(1) {
int retval = mq_receive(q,buff,sizeof(buff), NULL);
if(retval == -1) {
printf("read error %d %s\n", errno, strerror(errno));
} else {
printf("got message : %s", buff);
}
}
}
int main() {
struct mq_attr attr;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 32;
mq_unlink ("/ytm");
mqd_t queue = mq_open("/ytm", O_CREAT | O_RDWR, 0, &attr);
pthread_t tid;
pthread_create(&tid, 0 , producer, 0);
pthread_create(&tid, 0 , consumer, 0);
while(1);
}
推荐阅读
- npm - 在命令前加上问号是什么意思
- java - Firebase 查询找不到值
- java - 如果在检查 java 中是否存在哈希映射键时如何避免太多
- javascript - 为什么 onclick 函数不呈现(React.js)?
- r - 按特定列上的条件过滤行
- python - Tkinter 和 Pycharm 控制台无法始终如一地工作
- sql - 从较小的父表中删除较慢
- python - 将json查询结果加载到数据框
- python - 将 KivyMD ListItem 添加到 MDList 会在第一个成员之后产生空白成员
- google-colaboratory - 如何在 google colab 中导入 cplex?