无法解决此问题:错误 [EINVAL 无效参数] mq_open
Cannot resolve this: ERROR [EINVAL Invalid argument] mq_open
我正在从本书示例代码中的示例中学习消息队列:
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参数,仍然是同样的错误。
我在 Whosebug 中四处寻找过去的问题,但其中 none 似乎解决了我的问题。我 运行 在 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);
}
如果您阅读 mq_open
(here's an online copy) 的联机帮助页,它说:
EINVAL name doesn't follow the format in mq_overview(7).
mq_format(7) 表示名称需要以斜杠开头 (/
),而 aaa
则不需要。
我正在从本书示例代码中的示例中学习消息队列: 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参数,仍然是同样的错误。
我在 Whosebug 中四处寻找过去的问题,但其中 none 似乎解决了我的问题。我 运行 在 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);
}
如果您阅读 mq_open
(here's an online copy) 的联机帮助页,它说:
EINVAL name doesn't follow the format in mq_overview(7).
mq_format(7) 表示名称需要以斜杠开头 (/
),而 aaa
则不需要。