2017-06-13 3 views
-1

Documentation for mq_unlinkmq_unlinkの制限は何ですか?

ENAMETOOLONG 名が長すぎたと言います。

この制限は何ですか?私はそれがNAME_MAXだと思いましたが、そうではありません。次のコードは永遠に実行されます(メモリがある限り、私は推測します)。

#include <mqueue.h> 
#include <string> 
#include <errno.h> 
#include <unistd.h> 

int main(void) 
{ 
    std::string tooLong = "long"; 
    do 
    { 
     usleep(10); 
     tooLong.append("longer"); 
     mq_unlink(tooLong.c_str()); 
    } 
    while(errno != ENAMETOOLONG); 
} 

制限は何ですか?この関数はいつENAMETOOLONGを返しますか?

+0

エラーが発生する前に関数の戻り値をチェックする必要があります。あなたの名前が間違った形式である可能性もあります。 http://man7.org/linux/man-pages/man7/mq_overview.7.html –

+0

私が試すことができる限り、文字列が長さ257文字、つまりNAME_MAXの255文字より長くなると停止します。 – ilkkachu

答えて

0

ありがとうございます。

問題は、スラッシュがありませんでした。

#include <mqueue.h> 
#include <string> 
#include <errno.h> 
#include <unistd.h> 
#include <iostream> 
#include <limits.h> 

int main(void) 
{ 
    std::string tooLong = "/long"; 
    do 
    { 
     usleep(10); 
     tooLong.append("longer"); 
     mq_unlink(tooLong.c_str()); 
    } 
    while(errno != ENAMETOOLONG); 
    std::cout << tooLong.length() << " " << tooLong << std::endl;  
} 

これは機能し、長さはNAME_MAXのすぐ上にある257です。

+0

"問題は欠落していました!」と言っていますが、問題はあなたが 'mq_unlink()'のエラー値を見ていないということではありません。あなたはこの練習問題を避けることができます。あなたには良い練習があります。[C++の本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?noredirect=1&lq= 1) – Stargateur

関連する問題