2014-06-06 8 views
5

natknąłem bitowy kod, który mówikiedy nie można otworzyć (2) z errno == EMLINK?

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

flags jest albo O_RDONLY lub O_RDONLY|O_NOFOLLOW

IEEE 1003.1 2013 (SUSv4) ma tylko

  • [EMLINK] Too wiele linków. Podjęto próbę, aby liczba linków pojedynczego pliku przekroczyła {LINK_MAX}.

  • {LINK_MAX} Maksymalna liczba linków do pojedynczego pliku.

W jaki sposób otwarcie pliku zwiększa liczbę linków?

+2

Nie widzę "EMLINK" wymienionego jako jeden z możliwych błędów dla ['open'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html). Jest on jednak dostępny dla ['link'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html). –

+0

@Sander, ponieważ przeglądasz strony podręcznika linuxa! –

+0

@NicholasWilson: Nie, to samo dotyczy specyfikacji POSIX. Zobacz odpowiedź * Jean-Baptiste Yunès * poniżej. – alk

Odpowiedz

5

Dobre pytanie. Po dodaniu O_NOFOLLOW zdecydowali się ponownie użyć istniejącego kodu błędu, zamiast tworzyć nowy. EMLINK w tym przypadku oznacza, że ​​plik jest dowiązaniem symbolicznym i jest zwracany w FreeBSD. Linux i Darwin zwracają raczej ELOOP niż EMLINK, a NetBSD używa EFTYPE.

Moje strony podręcznika mówią, że O_NOFOLLOW to rozszerzenie FreeBSD dodane później do Linuksa (tzn. Jego zachowanie nie jest wyjaśnione w starszych wersjach SUS, ale jest zawarte w POSIX 2008 z kodem powrotu Linuksa).

+0

'ELOOP' zostanie zwrócony, gdy podążymy za zbyt wieloma dowiązaniami symbolicznymi lub gdy podano' O_NOFOLLOW'. –

+1

Istnieje dyskusja NetBSD na http://gnats.netbsd.org/43154 na temat przeciążenia istniejącego kodu przyjętego przez FreeBSD (chociaż NetBSD debatował na temat używania EFTYPE lub ELOOP zamiast) – mc110

+1

POSIX mówi ELOOP jest błędem, gdy określasz dołączone są dowiązania symboliczne i O_NOFOLLOW; Linux może implementować EMLINK po BSD, w którym to przypadku ani Linux ani BSD nie są zgodne z POSIX. Jednak Mac OS X dokumentuje ELOOP jako błąd po otwarciu dowiązania symbolicznego za pomocą O_NOFOLLOW. –

2

Nie jest to określone przez SUS v4. Zobacz http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html

+0

Masz rację, popełniłem błąd, nie jest to po prostu przepraszam. –

+0

+1: nie odpowiada na moje pytanie, ale jest odpowiednią odpowiedzią, biorąc pod uwagę początkowy brak znacznika [freebsd]. Dzięki za twój wysiłek! –

Powiązane problemy