2011-12-24 14 views
6

sendfile() makine A'dan makine B'ye veri almak için bir "dosya" tanımlayıcısından bir "soket" tanımlayıcısına veri iletmek için kullanılabilir. "soket" tanımlayıcısından gelen alıcı, benzer sıfır kopya semantiklere sahip bir dosyaya mı? Sanırım sendfile(), sendfile() veri kaynağının "page/buffer" önbelleği olması gerektiğinden, burada yardımcı olmadı. Anlayışım doğru mu? Bu durumda splice() yardımı olabilir mi?SendFile() ve splice() öğesinin anlamı

cevap

11

Bunun için sendfile sınırlaması konusunda haklısınız. Ve evet, splice yardımcı olabilir, ancak önemsiz: splice kaynak veya hedef dosya tanımlayıcılarından en az birinin bir boru olmasını gerektirir. Yani bir soketten bir düz dosya tanıtıcısına doğrudan splice yapamazsınız.

Kavramsal olarak, o iş yapmak için yapabileceği budur:

  • kurulum gelen soket fd ve çıktı dosyası fd normalde
  • bir döngü içinde pipe(2)
  • ile bir boru yaratacak şekilde : borunun okuma taraftan splice
  • yazma ile borunun yazma tarafına soketten
    • okuma th Ayrıca splice

tekrarlayın tüm veriler okunana kadar geçen aşamaları ile e dosyası.

Zero-Copy in Linux with sendfile() and splice(), bu tekniğin bir uygulamasına sahiptir.

+3

2.6.33'ten beri, sendfile için out_fd herhangi bir dosya tanıtıcısı olabilir (yalnızca yuva değil). – ldrg

+1

'dan beri 4.2 aynı "splice()" için de geçerli – technosaurus