2014-06-06 1 views
5

je suis tombé sur un morceau de code qui ditquand est-ce que open (2) échoue avec errno == EMLINK?

int fd = open(fn, flags, 0); 
if (fd < 0 && errno != EMLINK) 
    ... 

flags est soit O_RDONLY ou O_RDONLY|O_NOFOLLOW

IEEE Std 1003.1, 2013 (SUSv4) vient

  • [EMLINK] Trop beaucoup de liens. Une tentative a été effectuée pour que le nombre de liens d'un seul fichier dépasse {LINK_MAX}.

  • {LINK_MAX} Nombre maximal de liens vers un seul fichier. Comment l'ouverture d'un fichier augmente-t-elle le nombre de ses liens?

+2

Je ne vois pas 'EMLINK' répertorié comme l'une des erreurs possibles pour [' open'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html). Il est cependant répertorié pour ['link'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html). –

+0

@Sander parce que vous regardez les pages de manuel de Linux! –

+0

@NicholasWilson: Non, même pour les spécifications POSIX eux-mêmes. Voir * Jean-Baptiste Yunès * répondre ci-dessous. – alk

Répondre

5

Bonne question. Lorsque O_NOFOLLOW a été ajouté, ils ont choisi de réutiliser un code d'erreur existant plutôt que d'en créer un nouveau. EMLINK dans ce cas signifie que le fichier est un lien symbolique et est retourné sur FreeBSD. Linux et Darwin renvoient ELOOP plutôt que EMLINK, tandis que NetBSD utilise EFTYPE. Mes pages de manuel indiquent O_NOFOLLOW est une extension FreeBSD ajoutée par la suite à Linux (vous ne trouverez pas son comportement expliqué dans les anciennes versions du SUS, mais il est inclus dans POSIX 2008 avec le code retour Linux).

+0

'ELOOP' sera retourné en suivant trop de liens symboliques ou quand' O_NOFOLLOW' est spécifié. –

+1

Il y a une discussion de NetBSD à http://gnats.netbsd.org/43154 sur la surcharge de ce code existant adopté par FreeBSD (bien que NetBSD discutait à propos de l'utilisation d'EFTYPE ou ELOOP à la place) – mc110

+1

POSIX dit que ELOOP est l'erreur lorsque vous spécifiez un lien symbolique et O_NOFOLLOW est inclus; Linux peut implémenter EMLINK après BSD, auquel cas ni Linux ni BSD ne sont compatibles avec POSIX. Toutefois, Mac OS X documente ELOOP comme erreur lorsque vous ouvrez un lien symbolique avec O_NOFOLLOW. –

2

Ceci n'est pas spécifié par SUS v4. Voir http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html

+0

Vous avez raison, j'ai fait une erreur, ce n'est pas spécifié désolé. –

+0

+1: ne répond pas à ma question, mais est une réponse appropriée compte tenu de l'absence initiale de la balise [freebsd] néanmoins. Merci pour votre effort! –

Questions connexes