2014-06-06 15 views
5

mi sono imbattuto in un po 'di codice che dicequando open (2) fallisce con errno == EMLINK?

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

flags è o O_RDONLY o O_RDONLY|O_NOFOLLOW

IEEE Std 1003.1 2013 (SUSv4) ha appena

  • [EMLINK] Troppo molti collegamenti. Si è tentato di fare in modo che il numero di collegamenti di un singolo file superi {LINK_MAX}.

  • {LINK_MAX} Numero massimo di collegamenti a un singolo file.

in che modo l'apertura di un file aumenta il conteggio dei collegamenti?

+2

non vedo 'EMLINK' elencato come uno dei possibili errori di [' open'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html). È elencato per ['link'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html). –

+0

@Sander perché stai guardando le manpage di linux! –

+0

@NicholasWilson: No, lo stesso per le specifiche POSIX. Vedi * Jean-Baptiste Yunès * risposta sotto. – alk

risposta

5

Buona domanda. Quando è stato aggiunto O_NOFOLLOW, hanno scelto di riutilizzare un codice di errore esistente anziché crearne uno nuovo. EMLINK in questo caso significa che il file è un link simbolico e viene restituito su FreeBSD. Linux e Darwin restituiscono ELOOP anziché EMLINK, mentre NetBSD utilizza EFTYPE.

mie pagine di manuale dicono O_NOFOLLOW è un'estensione di FreeBSD successivamente aggiunto a Linux (cioè non troverete il suo comportamento ha spiegato nelle versioni precedenti del SUS, ma è incluso nel POSIX 2008 con il codice di ritorno di Linux).

+0

'ELOOP' verrà restituito quando si seguono troppi collegamenti simbolici o quando è specificato' O_NOFOLLOW'. –

+1

C'è una discussione NetBSD al http://gnats.netbsd.org/43154 circa il sovraccarico di questo codice esistente adottato da FreeBSD (anche se NetBSD stavano dibattendo su come utilizzare EFTYPE o ELOOP invece) – mc110

+1

POSIX dice ELOOP è l'errore quando si specifica un link simbolico e O_NOFOLLOW è incluso; Linux può implementare EMLINK dopo BSD, nel qual caso né Linux né BSD sono conformi a POSIX. Tuttavia, Mac OS X documenta ELOOP come errore quando si apre un collegamento simbolico con O_NOFOLLOW. –

2

Questo non è specificato da SUS v4. Vedere http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html

+0

Hai ragione ho commesso un errore, questo non è specificato, mi dispiace. –

+0

+1: non risponde alla mia domanda, ma è una risposta appropriata data la mancanza iniziale del tag [freebsd]. grazie per i tuoi sforzi! –

Problemi correlati