【发布时间】:2021-08-02 11:29:34
【问题描述】:
我正在从本书示例代码中的示例中学习消息队列: https://github.com/bradfa/tlpi-dist/blob/master/pmsg/pmsg_create.c
但是,在编译代码并运行它之后
./pmsg_create -c aaa
我明白了
ERROR [EINVAL Invalid argument] mq_open
使用 sudo 运行它也不能解决问题。我试过用不同的参数从命令行指定maxmsg和msgsize参数,还是一样的错误。
我在 stackoverflow 中查看了过去的问题,但似乎没有一个可以解决我的问题。我在 ubuntu 20.04 上运行它。下面贴出代码。
谁能告诉我错误的原因和解决方法?
#include <mqueue.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "tlpi_hdr.h"
static void
usageError(const char *progName)
{
fprintf(stderr, "Usage: %s [-cx] [-m maxmsg] [-s msgsize] mq-name "
"[octal-perms]\n", progName);
fprintf(stderr, " -c Create queue (O_CREAT)\n");
fprintf(stderr, " -m maxmsg Set maximum # of messages\n");
fprintf(stderr, " -s msgsize Set maximum message size\n");
fprintf(stderr, " -x Create exclusively (O_EXCL)\n");
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int flags, opt;
mode_t perms;
mqd_t mqd;
struct mq_attr attr, *attrp;
/* If 'attrp' is NULL, mq_open() uses default attributes. If an
option specifying a message queue attribute is supplied on the
command line, we save the attribute in 'attr' and set 'attrp'
pointing to 'attr'. We assign some (arbitrary) default values
to the fields of 'attr' in case the user specifies the value
for one of the queue attributes, but not the other. */
attrp = NULL;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 2048;
flags = O_RDWR;
/* Parse command-line options */
while ((opt = getopt(argc, argv, "cm:s:x")) != -1) {
switch (opt) {
case 'c':
flags |= O_CREAT;
break;
case 'm':
attr.mq_maxmsg = atoi(optarg);
attrp = &attr;
break;
case 's':
attr.mq_msgsize = atoi(optarg);
attrp = &attr;
break;
case 'x':
flags |= O_EXCL;
break;
default:
usageError(argv[0]);
}
}
if (optind >= argc)
usageError(argv[0]);
perms = (argc <= optind + 1) ? (S_IRUSR | S_IWUSR) :
getInt(argv[optind + 1], GN_BASE_8, "octal-perms");
printf("optind = %d, argv[%d] = %s, flags = %x, perms = %o\n", optind, optind, argv[optind], flags, perms);
mqd = mq_open(argv[optind], flags, perms, attrp);
if (mqd == (mqd_t) -1)
errExit("mq_open");
exit(EXIT_SUCCESS);
}
【问题讨论】:
标签: linux message-queue