mq_open错误:无效的参数

问题描述:

任何人都可以帮助我指出我的代码中的错误在哪里?
预先感谢您。mq_open错误:无效的参数

这里是我的code.I删除头文件中的代码below.When我跑了这些代码,我总是收到

:mq_open:无效的参数

#define FILE_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH 
struct mq_attr attr; 
int main (int argc,char **argv) 
{ 
    int c; 
    int flags; 
    mqd_t mqd; 

    flags = O_RDWR|O_CREAT; 

    while ((c = getopt (argc,argv,"em:z:")) != -1) { 
     switch (c) { 
      case 'e': 
       flags |= O_EXCL; 
       continue; 

      case 'm': 
       attr.mq_maxmsg = atol (optarg); 
       break; 

      case 'z': 
       attr.mq_msgsize = atol (optarg); 
       break; 
     } 
    } 

    if (optind != argc - 1) { 
     printf ("usage:mqcreate [-e] [-m maxseg -z msgsize] <name>\n"); 
     exit (1); 
    } 

    if ((attr.mq_maxmsg != 0 && attr.mq_msgsize == 0) || 
      (attr.mq_maxmsg == 0 && attr.mq_msgsize != 0)) 
    { 
     printf ("must specify both -m maxmsg and -z msgsize\n"); 
     exit (1); 
    } 

    if (attr.mq_msgsize == 0 && attr.mq_maxmsg == 0) 
    { 
     attr.mq_msgsize = 10; 
     attr.mq_maxmsg = 10; 
    } 


    mqd = mq_open (argv[optind],flags,FILE_MODE,&attr); 
    if (mqd == -1) { 
     perror ("mq_open"); 
     exit (1); 
    } 

    mq_close (mqd); 

    return 0; 
} 

我搜索了计算器这个问题,但没有人帮助我。
谢谢。

+0

请告诉我们什么命令行参数传递给程序。 – kaylum

+0

我使用gcc来编译这些代码:gcc -g mqcreate.c -o mqcreate -lrt,我运行mqcreate和-e -m 1024 -z 8192 ./foobar。这些代码来自unp值2. –

+0

尝试'/ foobar'而不是'。/ foobar'。 [mq_overview手册页说](https://linux.die.net/man/7/mq_overview):“每个消息队列由*/somename *形式的名称标识,即以空终止的字符串最多包含NAME_MAX(即255个)的字符,其中包含一个初始斜杠,后跟一个或多个字符,其中没有一个是斜杠。“ – kaylum

./foobar不是mq名称的有效值。 mq_overview man page

每个消息队列由form/somename的名称标识; 是一个由NAME_MAX(即255)字符 组成的以NULL结尾的字符串,其中包含一个初始斜杠,后跟一个或多个字符,其中没有一个是斜线。

因此,运行名称为arg /foobar而不是./foobar的程序。

+0

但是我在哪里可以找到由mq_open创建的mesage队列文件? –

+0

请阅读手册页:“挂载消息队列文件系统:在Linux上,消息队列在虚拟文件系统中创建.....” – kaylum

+0

好的,再次感谢您。 –