2011-04-10 13 views

cevap

7

Gönderdiğiniz bağlantının içeriği doğru. Bloke olmayan modda açılan normal bir dosya soketi, her zaman okuma için "hazır" olacaktır; gerçekten okumaya çalıştığınızda, işlem başarılı olana kadar engelleme (veya kaynağınız işaretlendiğinden daha doğru bir şekilde) ortaya çıkar.

Her durumda, kaynağınızın bazı sakinleştiricilere ihtiyacı olduğunu düşünüyorum. Öfkeli biri, yani.

+2

Sadece bana hafif kızgın gibi geldi. –

1

Hız engelleyici olmayan modun normal dosyalar için bir yararı olmadığı ve izin verilmediği konusunda haklısınız. Bunu değiştirmek için O_NONBLOCK ile birlikte ayarlanabilecek bir ikincil bayrak olsaydı hoş olurdu, ancak önbellek ve sanal bellek çalışması nedeniyle, doğru "engelleme" davranışı tanımlamak kolay bir iş değildir. sıradan dosyalar için. Programla ilişkili belleği kilitlemenize izin vermediğiniz sürece kesinlikle yarış koşulları olacaktır. (Aslında, sıradan dosyalar için bir tür uyumayan IO'nun uygulanmasının bir yolu, mmap dosya ve mlock haritasına olurdu.Ondan sonra, herhangi bir makul uygulamada, read ve write dosya ofset ve arabellek boyutu eşlenen bölgenin sınırları içinde kalmıştır.)

+0

mmap() ile ilgili olarak, engelleme olmayan dosyayı döndürmeyi engeller ... ;-) –

+1

Normal olmayan dosyalar için normal olmayan davranışların ne anlama geldiğini tanımlamak zor değildir. Çekirdek, bir sonraki 'read' tarafından talep edilen verinin sayfa önbelleğinde olduğu zaman dosyayı okunmaya hazır olarak işaret etmelidir. O zamana kadar gitmişse, çekirdek sadece “EWOULDBLOCK” 'u iade edebilir (ve istenen aralığı bazı zorunlu prefetch'e ekleyebilir ve mevcut olduğunda dosya okunmaya hazır olacak vb.). Eğer herkes doğru bir şekilde uygulanırsa, bir yarış durumu olmazdı, ama eğer birçok süreç birbirinden ayrılmaya devam ederse ve hiçbiri ilerlemezse, bir kurtuluş ihtimali olabilirdi. – DepressedDaniel

4

Son birkaç saat boyunca bunu oldukça yoğun bir şekilde kazdım ve alıntı yaptığınız bağlantının yazıcısının doğru olduğunu kanıtlayabilirim. Ancak, "daha iyi" (bu terimi çok gevşek kullanarak), v2.6 + için yerel Linux Kernel'de non-blocking IO against regular files desteğini destekliyor. "Libaio" paketi, çekirdeğin sunduğu işlevselliği ortaya koyan bir kütüphane içerir, ancak desteklenen ve Linux 2.6+ dışındaki herhangi bir şeye taşınabilir olmayan farklı dosya sistemleri hakkında bazı uyarılar vardır.

Ve konuyla ilgili olarak another good article.