2013-03-12 9 views
9

के बीच ब्रिजिंग मेरे पास एक सॉकेट है जो मैं select() कर रहा हूं, अन्य प्रक्रिया लिखने की प्रतीक्षा कर रहा हूं। एक बार लिखने के बाद, मैंने डेटा पढ़ा, और इसे किसी अन्य फ़ाइल डिस्क्रिप्टर को लिखा। मेरा सवाल यह है कि, फ़ाइल डिस्क्रिप्टर को सॉकेट पुल करने का कोई तरीका है, इसलिए जब डेटा तैयार होता है, तो यह स्वचालित रूप से अन्य फ़ाइल डिस्क्रिप्टर को लिखा जाएगा?दो फ़ाइल डिस्क्रिप्टर

इस तरह, मैं जिस बफर का उपयोग कर रहा हूं उसे फेंक सकता हूं, और सिस्टम में एक धागा छोड़ देता हूं।

+1

आप क्यों अब धागे की जरूरत है? – hyde

+0

क्या आप वर्णन कर सकते हैं कि आप किस समस्या को हल करने की कोशिश कर रहे हैं? पाइप ठीक वही करते हैं जो आप चाहते हैं, केवल विशिष्ट धाराओं से। क्या आपका मुद्दा नेटवर्क-विशिष्ट है? –

+0

@MichaelFoukarakis मैं विरासत कोड के साथ एक डेमॉन के लिए एक लॉगिंग पर्यावरण विकसित कर रहा हूँ। मैं कार्यान्वयन को नहीं बदल सकता, वैसे भी, पाइप केवल उसी प्रक्रिया संदर्भ में काम करते हैं, जो मेरे लिए काम नहीं करता है। – stdcall

उत्तर

4

क्षमा करें अगर मैंने आपकी स्थिति को गलत समझा, लेकिन क्या आपका मतलब sendfile जैसा है?

Sendfile - फ़ाइल वर्णनकर्ता के बीच हस्तांतरण डेटा

#include <sys/sendfile.h> 
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count"); 

Sendfile() एक फ़ाइल वर्णनकर्ता और एक अन्य के बीच प्रतियां डेटा। चूंकि यह प्रतिलिपि कर्नेल के भीतर की जाती है, sendfile() पढ़ने (2) और लिखने (2) के संयोजन से अधिक कुशल है, जिसके लिए उपयोगकर्ता स्थान से डेटा स्थानांतरित करने की आवश्यकता होगी।

+0

+1, मुझे लगता है कि वह यही चाहता है। – StarPinkER

+4

लिंक किए गए मैन पेज से स्निपेट: * in_fd तर्क एक फ़ाइल से मेल खाना चाहिए जो mmap (2) -like ऑपरेशंस का समर्थन करता है (यानी, यह सॉकेट नहीं हो सकता है)। * – hyde

+0

मेरे अनुभव में sendfile बहुत तेज़ है ... –

6

linux पर, splice() का उपयोग कर, अधिक उपयुक्त हो सकता है जब दिशा दायर करने के लिए सॉकेट से है। splice() का उपयोग करना थोड़ा अधिक जटिल है, लेकिन आपको दोनों दिशाएं मिलती हैं। साथ ही, मुझे लगता है कि sendfile इन दिनों splice internally का उपयोग करता है।

एसओ पर कई प्रश्न हैं जो पहले से ही splice() और sendfile() के बीच अंतरों पर चर्चा कर रहे हैं। वेब पर खोज करने से विवादित बयान भी पता चलता है कि (स्रोत और गंतव्यों) विभाजन किस प्रकार काम करता है। यह जानने का सबसे अच्छा तरीका है कि यह आपके मामले के लिए उपयुक्त है, इसका परीक्षण करना है।

एसओ के बारे में संगत फ़ाइल सिस्टम: Which file systems support splicing via Linux's splice(2)?

अतः वर्ष TCP सॉकेट के लिए जोड़ का समर्थन नहीं कर्नेल के बारे में: Does Linux's splice(2) work when splicing from a TCP socket?

ब्याह समझाया: http://kerneltrap.org/node/6505

ब्याह स्रोत: http://lxr.linux.no/#linux+v3.8.2/fs/splice.c

संबंधित मुद्दे