2016-09-19 5 views
0

Может кто-нибудь помочь мне указать, где ошибки в моем коде?
Спасибо заранее.ошибка в 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; 
} 

Я ищу StackOverflow для этот вопрос, но никто мне не помогает.
Спасибо.

+0

Пожалуйста, сообщите нам, какие аргументы командной строки были переданы программе. – kaylum

+0

Я использую gcc для компиляции этого кода: gcc -g mqcreate.c -o mqcreate -lrt, и я запускаю mqcreate с -e -m 1024 -z 8192 ./foobar. Этот код не имеет значения 2. –

+0

Попробуйте '/ foobar' вместо'./Foobar'. На странице [mq_overview man] указано (https://linux.die.net/man/7/mq_overview): «Каждая очередь сообщений идентифицируется по имени формы */somename *, то есть строка с завершающим нулевым символом до NAME_MAX (т. е. 255) символов, состоящих из начального косая черта, за которым следуют один или несколько символов, ни одна из которых не является слэшем ». – kaylum

ответ

1

./foobar недействительное значение для имени mq. mq_overview man page:

Каждая очередь сообщений идентифицируется по имени формы/имени; что представляет собой строку с нулевым завершением до NAME_MAX (то есть 255) символов , состоящую из начальной косой черты, за которой следует один или несколько символов, , ни одна из которых не является косой чертой.

Запустите программу с именем arg /foobar вместо ./foobar.

+0

Но где я могу найти файлы очереди сообщений, созданные mq_open? –

+0

Прочтите страницу руководства: «Установка файловой системы очереди сообщений: в Linux очереди сообщений создаются в виртуальной файловой системе .....» – kaylum

+0

ОК, еще раз спасибо. –