2014-06-06 11 views
5

ich auf ein Stück Code, kam dieWann ist open (2) fehlgeschlagen mit errno == EMLINK?

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

flags ist entweder O_RDONLY oder O_RDONLY|O_NOFOLLOW

IEEE Std 1003.1, 2013 (SUSv4) sagt, hat nur

  • [EMLINK] Too viele Links. Es wurde versucht, die Verknüpfungsanzahl einer einzelnen Datei auf {LINK_MAX} zu erhöhen.

  • {LINK_MAX} Maximale Anzahl von Links zu einer einzelnen Datei.

Wie erhöht das Öffnen einer Datei die Linkanzahl?

+2

Ich sehe 'EMLINK' nicht als einen der möglichen Fehler für [' open'] aufgelistet (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html). Es ist jedoch für [link] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html) aufgelistet. –

+0

@Sander, weil Sie die Linux-Hilfeseiten betrachten! –

+0

@NicholasWilson: Nein, das selbe für die POSIX Spezifikationen. Siehe * Jean-Baptiste Yunès * Antwort unten. – alk

Antwort

5

Gute Frage. Wenn O_NOFOLLOW hinzugefügt wurde, entschieden sie sich, einen vorhandenen Fehlercode zu verwenden, anstatt einen neuen Fehlercode zu erstellen. EMLINK bedeutet in diesem Fall, dass die Datei ein Symlink ist und unter FreeBSD zurückgegeben wird. Linux und Darwin geben ELOOP statt EMLINK zurück, während NetBSD EFTYPE verwendet.

Meine Manpages sagen O_NOFOLLOW ist eine FreeBSD-Erweiterung, die später zu Linux hinzugefügt wurde (dh Sie werden das Verhalten nicht in älteren Versionen von SUS finden, aber es ist in der POSIX 2008 mit dem Linux-Returncode enthalten).

+0

'ELOOP' wird zurückgegeben, wenn zu viele symbolische Links folgen oder wenn 'O_NOFOLLOW' angegeben wird. –

+1

Es gibt eine NetBSD-Diskussion unter http://gnats.netbsd.org/43154 über das Überladen dieses bestehenden Codes, der von FreeBSD übernommen wurde (obwohl NetBSD über die Verwendung von EFTYPE oder ELOOP debattierte) – mc110

+1

POSIX sagt ELOOP ist der Fehler, wenn Sie angeben ein Symlink und O_NOFOLLOW ist enthalten; Linux kann EMLINK nach BSD implementieren, wobei weder Linux noch BSD POSIX-konform sind. Mac OS X dokumentiert ELOOP jedoch als Fehler, wenn Sie einen Symlink mit O_NOFOLLOW öffnen. –

2

Dies wird nicht von SUS v4 spezifiziert. Siehe http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html

+0

Sie haben Recht, ich habe einen Fehler gemacht, dies wird nur nicht angegeben, sorry. –

+0

+1: beantwortet meine Frage nicht, ist aber eine angemessene Antwort angesichts des anfänglichen Fehlens des Tags [freebsd]. Danke für Ihre Bemühungen! –