我试图写一些使用Linux消息的客户端 – 服务器应用程序的例子。 这是我的代码:
#include <mqueue.h> #include <ctype.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #define MSG_SIZE 4096 #define MSG_MAX_COUNT 1024 #define MSG_TYPE_TO_UPPER 0 #define MSG_TYPE_EXIT 1 #define MQ_NAME "msg_queue" namespace { int str_toupper(char *str) { int len = 0; for(; str[len]; ++len) { str[len] = toupper(str[len]); } return len; } } int main(int argc, char** argv) { if(argc != 2) { fprintf(stderr, "Usage: msg_queue (client|server)\n"); exit(EXIT_FAILURE); } struct mq_attr attr; // MQueue attributes mqd_t mqd; // MQueue descriptor char buf[MSG_SIZE]; // Msg buffer unsigned int type; // Msg type(priority) // Set up MQueue attributes attr.mq_maxmsg = MSG_MAX_COUNT; attr.mq_msgsize = MSG_SIZE; attr.mq_flags = 0; attr.mq_curmsgs = 0; mqd = mq_open(MQ_NAME, O_RDWR | O_CREAT, 0664, &attr); if(mqd == -1) { fprintf(stderr, "mq_open() failed for \""MQ_NAME"\": %s\n", strerror(errno)); exit(EXIT_FAILURE); } if(strcmp(argv[1], "server") == 0) { while(mq_receive (mqd, buf, MSG_SIZE, &type) != -1) { if(type == MSG_TYPE_EXIT) { mq_unlink(MQ_NAME); mq_close(mqd); break; } else if(type == MSG_TYPE_TO_UPPER) { int len = str_toupper(buf); if(mq_send (mqd, buf, len, MSG_TYPE_TO_UPPER) == -1) { fprintf(stderr, "Server: mq_send() failed: %s", strerror(errno)); } } } } else if(strcmp(argv[1], "client") == 0) { while(1) { printf("Input a message: <type>(0 - TO_UPPER, 1 - EXIT) <message>\n"); scanf("%u %s", &type, buf); if(mq_send (mqd, buf, strlen(buf), type) == -1) { fprintf(stderr, "Client: mq_send() failed: %s", strerror(errno)); } if(type == MSG_TYPE_TO_UPPER) { if(mq_receive (mqd, buf, MSG_SIZE, &type) == -1) { fprintf(stderr, "Client: mq_receive() failed: %s", strerror(errno)); } printf("\"%s\" received\n", buf); } else if(type == MSG_TYPE_EXIT) { mq_unlink(MQ_NAME); mq_close(mqd); break; } } } else { fprintf(stderr, "Usage: msg_queue (client|server)\n"); exit(EXIT_FAILURE); } return 0; }
我的错误是什么? 它总是打印来自第47行的错误 – fprintf(stderr, "mq_open() failed for \""MQ_NAME"\": %s\n", strerror(errno));
与errno = EINVAL
。
我看到两个问题:
/
开始。 参见mq_overview(7)
: 每个消息队列由form / somename的名称标识; 也就是说,一个由NAME_MAX(即255个)字符组成的以null结尾的字符串,其中包含一个初始斜杠,后跟一个或多个字符,但不包括任何斜杠。
MSG_MAX_COUNT
最有可能超出您的系统限制。 它必须小于(或等于) /proc/sys/fs/mqueue/max_size
。 看mq_open(3)
:
EINVAL
:O_CREAT在oflag中指定,attr不为NULL,但attr->mq_maxmsg
或attr->mq_msqsize
无效。 这两个字段必须大于零。 在非特权进程中(不具有CAP_SYS_RESOURCE功能),attr->mq_maxmsg
必须小于或等于msg_max限制 ,并且attr->mq_msgsize
必须小于或等于msgsize_max限制。 另外,即使在特权进程中,attr->mq_maxmsg
也不能超过HARD_MAX限制。 (有关这些限制的详细信息,请参阅mq_overview(7)。)
另一个限制可能是好的,但是你也应该验证一下。