2017-06-13 12 views
-1

Documentation for mq_unlink ditQuelle est la limite dans mq_unlink?

nom ENAMETOOLONG était trop long.

mais quelle est cette limite? Je pensais que c'était NAME_MAX, mais ce n'est pas le cas. Le code suivant s'exécute pour toujours (tant qu'il y a de la mémoire, je suppose).

#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); 
} 

Alors, quelle est la limite? Quand cette fonction renvoie-t-elle ENAMETOOLONG?

+0

Vous devez vérifier la valeur de retour de la fonction avant de supposer qu'il y a une erreur. Il semble également que votre nom soit dans un format incorrect. http://man7.org/linux/man-pages/man7/mq_overview.7.html –

+0

autant que je peux tester, il s'arrête quand la chaîne devient 257 caractères de long, c'est-à-dire plus long que "NAME_MAX" de 255. – ilkkachu

Répondre

0

Merci, vous avez raison.

Le problème était la barre oblique manquante!

#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;  
} 

Cela fonctionne et la longueur est 257 qui est juste au-dessus de NAME_MAX.

+0

" Le problème était la barre oblique manquante! ", Non le problème est que vous ne regardez pas la valeur d'erreur de' mq_unlink() '. Vous pourriez éviter cette question est vous avez une bonne pratique, s'il vous plaît lire [un livre de C++] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?noredirect=1&lq= 1) – Stargateur