2011-12-24 18 views
6

sendfile() को "फ़ाइल" डिस्क्रिप्टर से डेटा को "सॉकेट" डिस्क्रिप्टर में डेटा संचारित करने के लिए मशीन ए से मशीन बी प्राप्त करने के लिए उपयोग किया जा सकता है। क्या डेटा को प्राप्त करना संभव है "सॉकेट" डिस्क्रिप्टर से प्राप्त होने वाली फ़ाइल को समान शून्य-प्रति semantics वाली फ़ाइल में प्राप्त करना? मुझे लगता है कि sendfile() यहां सहायता नहीं करता है क्योंकि sendfile() को "पृष्ठ/बफर" कैश होने के लिए डेटा के स्रोत की आवश्यकता है। क्या मेरी समझ सही है? splice() इस स्थिति में मदद कर सकते हैं?sendfile() और splice()

उत्तर

11

आप इसके लिए sendfile की सीमा के बारे में सही हैं। और हाँ, splice मदद कर सकता है, लेकिन यह छोटा नहीं है: splice की आवश्यकता है कि कम से कम एक स्रोत या लक्ष्य फ़ाइल वर्णनकर्ता एक पाइप हो। तो आप किसी सॉकेट से सीधे सादे फ़ाइल डिस्क्रिप्टर तक splice नहीं कर सकते हैं। अपने भीतर का सॉकेट fd और अपने आउटपुट फ़ाइल fd

  • सेटअप आप सामान्य रूप से
  • एक पाश में pipe(2)
  • के साथ एक पाइप बनाने के रूप में:

    वैचारिक रूप से, क्या आप इसे काम करने के लिए क्या कर सकते हैं : के साथ पाइप के पढ़ने की ओर से splice

  • लिखने पाइप के लिखने ओर करने के लिए सॉकेट से
    • पढ़ने th के लिए splice भी

दोहराएँ अंतिम चरण तक सभी डेटा पढ़ा जाता है के साथ ई फ़ाइल।

Zero-Copy in Linux with sendfile() and splice() इस तकनीक का कार्यान्वयन है।

+3

2.6.33 के बाद से sendfile के लिए out_fd कोई फ़ाइल डिस्क्रिप्टर (केवल सॉकेट नहीं) हो सकता है। – ldrg

+1

4.2 के बाद से यह 'splice() 'के लिए जाता है – technosaurus