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ı
6
A
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
- okuma th Ayrıca
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.
2.6.33'ten beri, sendfile için out_fd herhangi bir dosya tanıtıcısı olabilir (yalnızca yuva değil). – ldrg
'dan beri 4.2 aynı "splice()" için de geçerli – technosaurus