2017-08-08 13 views
0

Je travaille actuellement avec pthread et lis la documentation d'ici: Pthread Manual Pthread Join.Comment lire la page de manuel pour POSIX en se référant aux codes d'erreur?

Cependant, quand je lis les pages, je vois les ERREURS, mais pas les valeurs de retour correspondantes, qui seront retournées par pthread_join. Ma question est donc: les ERREURS sont-elles classées par ordre croissant (puisqu'il pourrait s'agir d'un recenseur)?

+0

Non, vous ne pouvez pas supposer quoi que ce soit sur les valeurs spécifiées, sauf qu'ils sont int-compatibles et ne correspondent à aucune valeur de retour possible en cas de succès. –

Répondre

1

Les valeurs d'erreur telles que EDEADLK sont des macros définies en incluant le fichier d'en-tête <errno.h>.

Exemple:

#include <pthread.h> 
#include <errno.h> 

... 

int retval = pthread_join(threadID, NULL); 
if (retval == EDEADLK) 
{ 
    // error-handling code for deadlock 
} 
else if (retval == EINVAL) 
{ 
    // error-handling code for invalid thread id 
} 
else if (retval == ESRCH ) 
{ 
    // error-handling code for no such thread id 
} 

Notez que le code ci-dessus est correct uniquement pour Linux, comme le seul numéro d'erreur est specified by POSIX for pthread_join()EDEADLCK.

par the POSIX standard for error numbers, (parties particulièrement pertinentes à caractère gras à votre question):

2.3 Numéros d'erreur

La plupart des fonctions peuvent fournir un numéro d'erreur. Le moyen par lequel chaque fonction fournit ses numéros d'erreur est spécifié dans sa description.

Certaines fonctions fournissent le numéro d'erreur dans une variable accessible par le symbole errno, défini en incluant l'en-tête <errno.h>. La valeur de errno ne doit être examinée que s'il est indiqué être valide par la valeur de retour d'une fonction. Aucune fonction dans ce volume de POSIX.1-2008 ne doit mettre errno à zéro. Pour chaque fil d'un processus, la valeur de errno ne doit pas être affectée par les appels de fonction ou par errno d'autres threads.

Certaines fonctions renvoient directement un numéro d'erreur en tant que valeur de fonction. Ces fonctions renvoient une valeur de zéro pour indiquer le succès.

Si plus d'une erreur se produit dans le traitement d'un appel de fonction, une des erreurs possibles peuvent être retournés, comme l'ordre de détection est non définie.

peuvent supporter des erreurs Implémentations supplémentaires qui ne figurent pas dans cette liste , peut générer des erreurs incluses dans cette liste dans des circonstances autres que celles décrites ici, ou peuvent contenir des extensions ou limitations qui empêchent certaines erreurs de se produire.

La ERREURS section sur chaque page de référence indique quelle erreur conditions doivent être détectées par toutes les implémentations (« doit faire faillite ») et qui peut être détectée par le cas échéant une mise en oeuvre (« peut échouer »). Si aucune condition d'erreur n'est détectée, l'action demandée doit être réussie. Si une condition d'erreur est détectée, l'action demandée peut avoir été partiellement réalisée, sauf indication contraire.

peuvent générer des nombres Implémentations d'erreur répertoriés ici dans circonstances autres que celles décrites, si et seulement si toutes les conditions d'erreur peuvent toujours être traitées de manière identique à l'erreur conditions telles que décrites dans le présent volume de POSIX.1-2008. Les implémentations ne doivent pas générer un numéro d'erreur différent d'un requis par ce volume de POSIX.1-2008 pour une condition d'erreur décrite dans ce volume de POSIX.1-2008, mais peut générer des erreurs supplémentaires sauf si explicitement interdit pour un particulier fonction. Chaque implémentation doit documenter, dans le document de conformité, les situations dans lesquelles chacune des conditions facultatives définies dans POSIX.1-2008 est détectée. Le document de conformité peut également contenir des instructions indiquant qu'une ou plusieurs des conditions d'erreur facultatives ne sont pas détectées.

Certaines fonctions liées aux threads ne sont pas autorisées à renvoyer un code d'erreur de [EINTR]. Lorsque cela s'applique, il est indiqué dans la section ERREURS sur les pages de fonction individuelles.

Les noms de macro suivants identifient les numéros d'erreur possibles, dans le cadre des fonctions spécifiquement définies dans ce volume de POSIX.1-2008; ces descriptions générales sont définies plus précisément dans les sections ERRORS des fonctions qui les renvoient. Seuls ces noms de macro doivent être utilisés dans les programmes, car la valeur réelle du numéro d'erreur n'est pas spécifiée. Toutes les valeurs énumérées dans cette section doivent être uniques ( ), sauf indication contraire ci-dessous. Les valeurs de toutes ces macros doivent être trouvées dans l'en-tête <errno.h> défini dans le volume Base Définitions de POSIX.1-2008. Les valeurs réelles ne sont pas spécifiées par ce volume de POSIX.1-2008.

[E2BIG] 
    Argument list too long. The sum of the number of bytes 
    used by the new process image's argument list and environment 
    list is greater than the system-imposed limit of {ARG_MAX} bytes. 

    or: 

    Lack of space in an output buffer. 

    or: 

    Argument is greater than the system-imposed maximum. 
[EACCES] 
    Permission denied. An attempt was made to access a file 
    in a way forbidden by its file access permissions. 
[EADDRINUSE] 
    Address in use. The specified address is in use. 
[EADDRNOTAVAIL] 
    Address not available. The specified address is not 
    available from the local system. 
[EAFNOSUPPORT] 
    Address family not supported. The implementation does 
    not support the specified address family, or the specified 
    address is not a valid address for the address family 
    of the specified socket. 
[EAGAIN] 
    Resource temporarily unavailable. This is a temporary 
    condition and later calls to the same routine may complete 
    normally. 
[EALREADY] 
    Connection already in progress. A connection request is already 
    in progress for the specified socket. 
    . 
    . 
    .