2010-05-12 10 views
6

मैं एक फ़ाइल डिस्क्रिप्टर को स्मृति मैप करने में सक्षम होना चाहता हूं, इसलिए मैं कुछ मौजूदा कार्यों का उपयोग कर सकता हूं जिन्हें फ़ाइल डिस्क्रिप्टर की आवश्यकता है। यहां अनिवार्य रूप से मैं क्या देख रहा हूं:सिस्टम डिस्क्रिप्टर (उलटा mmap) में मेमोरी मैप करने के लिए सिस्टम कॉल?

void do_operation1(int fd); 

char data[DATA_MAX] = { /* embedded binary data */ }; 
int fd = addr_to_fd(data, DATA_MAX); 

do_operation1(fd); 
/* ... operate on fd ... */ 

मैं इसे पूरा करने के लिए किस सिस्टम कॉल या कॉल का उपयोग कर सकता हूं?

उत्तर

7

कुछ कार्यान्वयन में fmemopen() है। (फिर बेशक आपको fileno() पर कॉल करना होगा)।

यदि आपका नहीं है, तो आप इसे fork() और pipe() के साथ स्वयं बना सकते हैं।

+1

यह पता चला है कि 'FILE *' 'LILE *' 'fmemopen 'से आता है या कुछ समकक्ष' लिनक्स /) दोनों लिनक्स/फ्रीबीएसडी (और मैं दूसरों को मानता हूं) पर विफल रहता है। फ़ाइल डिस्क्रिप्टर प्राप्त करने के तरीके के बिना, मुझे यकीन नहीं है कि हमारे पास समाधान है। बीएसडी पर 'funopen' का उपयोग करके –

+1

'fmemopen' भी लागू किया जा सकता है। एक कार्यान्वयन https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'फोर्क() 'के लिए भारी वजन के लिए उपलब्ध है यह उद्देश्य मैं इसके बजाए एक धागे का उपयोग करने का सुझाव देना चाहूंगा। पाइप से पढ़ने और लिखने के बीच मल्टीप्लेक्स के लिए 'चयन() 'का उपयोग करना बेहतर होगा, लेकिन मुझे लगता है कि यह एक विकल्प नहीं है। – Sven

2

निश्चित रूप से, बस open(argv[0], ...), फ़ाइल के माध्यम से स्कैन करें कि यह पता लगाने के लिए कि आपका बाइनरी डेटा कहां से शुरू होता है, lseek() वहां और किया गया। उस फ़ाइल में आपके बाइनरी डेटा की लंबाई नहीं होगी।

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