C mqueue 不发送或接收整个消息
C mqueue doesn't send or receive the entire message
我尝试使用消息队列实现一个简单的 C 程序,但是该队列不发送或接收长度超过 8 个字符的消息。我试图正确设置所有参数,但我一定是遗漏了一些东西。
下面是代码和输出。
代码:
int main()
{
mqd_t mq = mq_open("/mq", O_RDWR | O_CREAT, 0666, NULL);
if (mq == -1) exit(1);
char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);
char* mes2 = "eightcharacters";
n = mq_send(mq, mes2, sizeof(mes2), 0);
if (n == -1) exit(1);
struct mq_attr attr;
int buflen;
char *buf;
mq_getattr(mq, &attr);
buflen = attr.mq_msgsize;
buf = (char *) malloc(buflen);
printf("buflen: %d\n", buflen);
n = mq_receive(mq, (char *) buf, buflen, NULL);
if (n == -1) { exit(1); }
printf("%s\n",buf);
n = mq_receive(mq, (char *) buf, buflen, NULL);
if (n == -1) { exit(1); }
printf("%s\n",buf);
free(buf);
mq_close(mq);
return 0;
}
输出:
buflen: 8192
adventur
eightcha
给定代码
char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);
sizeof(mes)
是指针的大小mes
,不是它指向的字符串的长度。
sizeof
会给你指针的大小(你似乎是在 64 位架构上,所以指针是 8 个字节长)。
更正您的代码:
- 使用
strlen
函数而不是 sizeof
(在这种情况下,您必须处理最终的 [=13=]
)
或
- 替换您的字符串声明:
char mes2[] = "eightcharacters";
我尝试使用消息队列实现一个简单的 C 程序,但是该队列不发送或接收长度超过 8 个字符的消息。我试图正确设置所有参数,但我一定是遗漏了一些东西。
下面是代码和输出。
代码:
int main()
{
mqd_t mq = mq_open("/mq", O_RDWR | O_CREAT, 0666, NULL);
if (mq == -1) exit(1);
char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);
char* mes2 = "eightcharacters";
n = mq_send(mq, mes2, sizeof(mes2), 0);
if (n == -1) exit(1);
struct mq_attr attr;
int buflen;
char *buf;
mq_getattr(mq, &attr);
buflen = attr.mq_msgsize;
buf = (char *) malloc(buflen);
printf("buflen: %d\n", buflen);
n = mq_receive(mq, (char *) buf, buflen, NULL);
if (n == -1) { exit(1); }
printf("%s\n",buf);
n = mq_receive(mq, (char *) buf, buflen, NULL);
if (n == -1) { exit(1); }
printf("%s\n",buf);
free(buf);
mq_close(mq);
return 0;
}
输出:
buflen: 8192
adventur
eightcha
给定代码
char* mes = "adventure";
int n = mq_send(mq, mes, sizeof(mes), 0);
sizeof(mes)
是指针的大小mes
,不是它指向的字符串的长度。
sizeof
会给你指针的大小(你似乎是在 64 位架构上,所以指针是 8 个字节长)。
更正您的代码:
- 使用
strlen
函数而不是sizeof
(在这种情况下,您必须处理最终的[=13=]
)
或
- 替换您的字符串声明:
char mes2[] = "eightcharacters";