我目前正在使用POSIX消息队列进行最小化的IPC。我有一个管道只能通过uint8_t
作为命令,另一个管道将传递长度最长为128个字符的字符串。命令管道工作正常。但是,烟管总是会给我errno数字90,这意味着message too long
。我写了一个证明问题的简单例子(请注意:我保持最小限度,所以除了收到错误之外,没有任何错误处理)。POSIX消息队列errno 90消息太长
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
int msg_size = 128;
int send()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
strncpy(msg, "this_is_a_test", msg_size);
mq_send(mq, msg, msg_size, 0);
}
int recv()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
int res = mq_receive(mq, msg, msg_size, NULL);
if (res == -1)
{
printf("Errno: %d\n", errno);
}
else
{
printf("Message: %s\n", msg);
}
}
int main()
{
send();
recv();
return 0;
}
编译:
g++ -o mq mq.c -lrt
为什么在没有C++代码时使用C++编译器进行编译?建议使用'gcc'。编译时,始终启用所有警告。对于'gcc' /'g ++'至少可以使用:'-Wall -Wextra -pedantic'我也使用:'-Wconversion -std = gnu99'。对于发布的代码,编译器将输出许多警告消息。修复这些警告。 – user3629249
1)只需要打开一个消息队列一次,而不管使用该队列的进程数量是多少。 2)'struct mq_attr'中的实际字段列表取决于实现,因此不能使用初始值设定项,而是按字段名设置每个字段,类似于:'mset(&attr,'\ 0',sizeof(attr)) ; attr.mq_maxmsg = 300; attr.mq_msgsize = MSG_SIZE; attr.mq_flags = 0;' – user3629249