2011-01-20 17 views
5

मुझे स्मृति आवंटित करने की आवश्यकता है, लेकिन मैं malloc का उपयोग नहीं कर सकता क्योंकि यह पुनर्वित्त नहीं है, इसलिए मूल रूप से मैं POSIX mmap फ़ंक्शन का उपयोग करके गतिशील स्मृति आवंटन को कार्यान्वित करूंगा। क्या mmap का उपयोग करना संभव है?स्मृति आवंटित करने के लिए mmap का उपयोग करें

+0

"पुनर्विक्रेता" आमतौर पर 'मॉलोक' जैसे सभी पत्ते कार्यों को शामिल करने के लिए समझा जाता है। 'malloc' में आपके कोड पर कॉलबैक तंत्र नहीं है, इसलिए कोई रास्ता नहीं है कि आप इसे फिर से दर्ज कर सकें (उसी धागे पर)। कोई भी पुनर्वित्त पूरी तरह से भीतर और मानक पुस्तकालय के नियंत्रण में होगा। – MSalters

+0

@MSalters: संभवतः वह एक सिग्नल हैंडलर में स्मृति आवंटित करना चाहता है, जिस स्थिति में malloc() पुनर्विक्रेता नहीं है एक समस्या है। – janneb

+0

@janneb: क्या यह वैसे भी अस्वीकृत नहीं है? – MSalters

उत्तर

1

संपादित करें: धागा सुरक्षित

malloc द्वारा प्रतिस्थापित रैत्रांत धागा सुरक्षित सबसे ओएस पर है।

आप किस का उपयोग कर रहे हैं और क्या आप वाकई थ्रेड-सुरक्षित नहीं हैं? या क्या आपको इसे पुनर्वित्त करने की आवश्यकता है (मुझे नहीं लगता)?

+0

मैं glibc में उपयोग कर रहा हूं, इसलिए मुझे लगता है कि यह एक गैर-पुनर्वित्त समारोह है। क्या आपको लगता है कि मैं मॉलोक का उपयोग कर सकता हूं? – domlao

+6

अधिकांश प्रणालियों पर आज malloc थ्रेड-सुरक्षित है लेकिन पुनर्वित्त नहीं है। – janneb

+1

हां आप glibc malloc का उपयोग कर सकते हैं। जैसा कि जेनब कहते हैं, यह थ्रेड-सुरक्षित है और पुनर्वित्त नहीं है, लेकिन मुझे लगता है कि आपको यही चाहिए। –

5

हां, mmap() पुनर्विक्रेता होना चाहिए ताकि आप इसका उपयोग कर सकें। ध्यान दें कि mmap() अक्सर एक धीमी गति से ऑपरेशन होता है, इसलिए आप संभवतः उन लोगों (अपेक्षाओं से) कुछ और दूर उन मामलों के बीच बेहतर तरीके से उपयोग कर सकते हैं जहां सामान्य उद्देश्य malloc() प्रतिस्थापन के बजाय, वास्तव में इसकी आवश्यकता होती है।

POSIX 2008 में एसिंक-सिग्नल-सुरक्षित फ़ंक्शंस की एक सूची है जो सिग्नल हैंडलर फ़ंक्शन से कॉल करने के लिए सुरक्षित है (लिंक में खंड 2.4.2 में तालिका देखें)। mmap() उस सूची में नहीं है, यानी, सिग्नल हैंडलिंग फ़ंक्शन से mmap() को कॉल करने के परिणामस्वरूप अपरिभाषित व्यवहार हो सकता है।

सिग्नल हैंडलर में स्मृति आवंटित करने से बचने के लिए आप क्या कर सकते हैं, बस कुछ ध्वज सेट करें और बाद में वास्तविक कार्य करें।

+0

यह हमेशा काम नहीं करता है, उदाहरण के लिए यदि सिग्नल हैंडलर का कार्य सिग्नल डेटा (बाद में प्रसंस्करण के लिए) को सहेजना है। malloc() reentrancy के कारण इस्तेमाल नहीं किया जा सकता है, ढेर का उपयोग नहीं किया जा सकता है क्योंकि यह हैंडलर रिटर्न पर नष्ट हो जाएगा, इस तरह ओपी ने कुछ असामान्य कामकाज पर विचार करना शुरू किया। – peterh

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