2014-06-06 26 views
5

iaçık (2) errno == EMLINK ile başarısız mı?

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

flags Std 1003.1 ya O_RDONLY veya O_RDONLY|O_NOFOLLOW

IEEE diyor kod biraz geldi, 2013 (SUSv4) çok sadece

  • [EMLINK] sahip birçok bağlantı. Tek bir dosyanın bağlantı sayısının {LINK_MAX} değerini aşması için bir girişimde bulunuldu.

  • {LINK_MAX'in} tek bir dosya bağlantıların maksimum sayısı.

Dosya açma işlemi bağlantı sayısını nasıl artırır?

+2

I 'EMLINK' için muhtemel hataların olarak listelenir [' open'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) görülmüyor. Yine de ['link'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html) için listelenir. –

+0

@Sander çünkü linux man sayfalarına bakıyorsunuz! –

+0

@NicholasWilson: Hayır, POSIX teknik özellikleriyle aynı. Aşağıda * Jean-Baptiste Yunès * cevabı gör. – alk

cevap

5

İyi soruya bakın. O_NOFOLLOW eklendiğinde, yeni bir tane oluşturmak yerine mevcut bir hata kodunu yeniden kullanmayı seçtiler. Bu durumda EMLINK, dosyanın bir sembolik olduğunu ve FreeBSD'de döndüğünü belirtir. NetBSD EFTYPE kullanırken Linux ve Darwin, EMLINK yerine ELOOP dönün.

Man sayfalarım,'un Linux'a sonradan eklenen bir FreeBSD eklentisi olduğunu söyler (yani davranışlarını SUS'un eski sürümlerinde açıklanmış halde göremezsiniz, ancak POSIX 2008'de Linux dönüş koduyla birlikte gelir).

+0

'ELOOP', çok fazla sembolik bağlantı izlendiğinde veya 'O_NOFOLLOW' belirtildiğinde döndürülür. –

+1

http://gnats.netbsd.org/43154 adresinde, FreeBSD tarafından benimsenen bu mevcut kodun aşırı yüklenmesi hakkında bir NetBSD tartışması var (NetBSD, bunun yerine EFTYPE veya ELOOP kullanımı hakkında tartışıyor olsa da) – mc110

+1

POSIX, belirttiğinizde ELOOP'un hata olduğunu söylüyor. bir sembolik link ve O_NOFOLLOW dahildir; Linux, BSD'yi takiben EMLINK'i uygulayabilir; bu durumda Linux veya BSD, POSIX uyumlu değildir. Ancak Mac OS X, O_NOFOLLOW ile bir sembolik bağlantı açtığınızda hata olarak ELOOP dosyasını belgeler. –

2
+0

Haklısınız, bir hata yaptım, bu sadece belirtilmemiş bir özür değil. –

+0

+1: sorumu yanıtlamıyor, ancak yine de [freebsd] etiketinin başlangıçtaki eksikliğinden dolayı verilen uygun bir yanıttır. emeğin için teşekkürler! –