2017-06-13 146 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_MAX255更長時,它停止。 – 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;  
} 

這個工作和長度是257,這正是NAME_MAX正上方。

+0

「問題是缺少斜槓!「,不,問題是你沒有看到'mq_unlink()'的錯誤值。你可以避免這個問題,你有很好的做法,請閱讀[一本C++](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?noredirect=1&lq= 1) – Stargateur

相關問題