2014-06-06 67 views
5

我碰到一個比特的碼,其表示何時打開(2)errno == EMLINK失敗?

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

flags要麼O_RDONLYO_RDONLY|O_NOFOLLOW

IEEE標準1003.1,2013(SUSv4)剛剛

  • [EMLINK] 太很多鏈接。試圖讓單個文件的鏈接數超過{LINK_MAX}。

  • {LINK_MAX} 指向單個文件的最大鏈接數。

打開文件如何增加鏈接數?

+2

我沒有看到EMLINK被列爲['open'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html)的可能錯誤之一。不過,它已列入['link'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html)。 –

+0

@Sander,因爲您正在查看linux手冊頁! –

+0

@NicholasWilson:不,對於POSIX規範本身也是一樣的。請參閱下面的* Jean-BaptisteYunès*回答。 – alk

回答

5

好問題。當添加O_NOFOLLOW時,他們選擇重用現有的錯誤代碼而不是組成新的錯誤代碼。在這種情況下,EMLINK表示該文件是符號鏈接,並在FreeBSD上返回。 Linux和Darwin返回ELOOP而不是EMLINK,而NetBSD使用EFTYPE

我的手冊頁說O_NOFOLLOW是隨後添加到Linux上的FreeBSD擴展(即,您不會在老版本的SUS中找到它的行爲,但它包含在帶有Linux返回代碼的POSIX 2008中)。

+0

當遵循太多的符號鏈接或者指定了'O_NOFOLLOW'時,會返回'ELOOP'。 –

+1

http://gnats.netbsd.org/43154上有關於FreeBSD使用的這個現有代碼的重載的NetBSD討論(雖然NetBSD正在討論使用EFTYPE或ELOOP代替) – mc110

+1

POSIX說ELOOP是你指定的錯誤包含符號鏈接和O_NOFOLLOW; Linux可能會在BSD之後實施EMLINK,在這種情況下,Linux和BSD都不符合POSIX標準。但是,當您使用O_NOFOLLOW打開符號鏈接時,Mac OS X會將ELOOP記錄爲錯誤。 –

相關問題