2016-09-19 19 views
0

誰かが私のコードのどこにエラーがあるのか​​を教えてもらえますか?
ありがとうございます。 mq_open:無効な引数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の検索ここで

は私code.Iは、私はいつも

を受け、私はこれらのコードを実行したbelow.Whenコードのヘッダファイルを削除していますこの質問は何も私を助けません。
ありがとうございます。

+0

どのコマンドライン引数がプログラムに渡されたか教えてください。 – kaylum

+0

私はこれらのコードをコンパイルするためにgccを使います:gcc -g mqcreate.c -o mqcreate -lrtそして、-e -m 1024 -z 8192 ./foobarでmqcreateを実行します。これらのコードはunp値2のものです。 –

+0

'。/ foobar'ではなく'/foobar'を試してください。 [mq_overview man page](https://linux.die.net/man/7/mq_overview): "各メッセージキューは*/somename *という形式の名前で識別されます。つまり、NULLで終了する文字列です"NAME_MAX(すなわち、255)までの最初のスラッシュとそれに続く1つ以上の文字で構成され、いずれもスラッシュではありません。" – kaylum

答えて

1

./foobarは、mq名の有効な値ではありません。 mq_overview man page

各メッセージキューは、/ somenameという形式の名前で識別されます。その は、NAME_MAX(255)までのヌルで終端された文字列 の最初のスラッシュと、それに続く1つ以上の文字からなり、 はスラッシュではありません。

./foobarの代わりにarg /foobarという名前のプログラムを実行します。

+0

しかし、mq_openによって作成されたメッシュキューファイルはどこにありますか? –

+0

マニュアルページ「メッセージキューファイルシステムのマウント:Linuxではメッセージキューは仮想ファイルシステムに作成されています.....」 – kaylum

+0

ok、もう一度ありがとうございます。 –