2013-10-05 10 views
5
प्वाइंटर

मैं एक साझा स्मृति खंड में keys को shm_open और mmap का उपयोग कर मैं सिर्फ एक सूचक छड़ी कर सकते हैं fork() 'घ प्रक्रियाओं के बीच एक char **keys सरणी की तरह कुछ साझा करना चाहते हैं या मैं सभी डेटा की प्रतिलिपि करने की क्या ज़रूरत है, तो साझा स्मृति खंड में keys में?शेयरिंग के बीच एकाधिक काँटेदार प्रक्रियाओं

उत्तर

5

आप जिस डेटा को साझा करना चाहते हैं वह साझा सेगमेंट में होना चाहिए। इसका मतलब यह है कि दोनों पॉइंटर्स और तारों को साझा स्मृति में होना चाहिए।

पॉइंटर्स समेत कुछ साझा करना बोझिल हो सकता है। ऐसा इसलिए है क्योंकि mmap गारंटी नहीं देता है कि दिए गए मैपिंग आवश्यक पते में समाप्त हो जाएंगे।

आप अभी भी दो तरीकों से ऐसा कर सकते हैं। सबसे पहले, आप एमएमएपी के साथ अपनी किस्मत आजमा सकते हैं और उम्मीद करते हैं कि गतिशील लिंकर आपके पसंदीदा पते पर कुछ लोड नहीं करता है।

दूसरी विधि सापेक्ष पॉइंटर्स का उपयोग करना है। एक सूचक के अंदर एक सूचक को संग्रहीत करने के बजाय, सूचक के अंदर, आप सूचक के पते और स्ट्रिंग के पते के बीच का अंतर संग्रहीत करते हैं। इसलिए जैसा:

char **keys= mmap(NULL, ...); 
char *keydata= (char*) keys + npointers * sizeof(char*); 
strcpy(keydata, firstring); 
keys[0]= (char*) (keydata - (char*) &keys[0]); 
keydata+= strlen(firststring)+1; 

आप अन्य प्रक्रिया से स्ट्रिंग का उपयोग करना चाहते हैं, आप रिवर्स कार्य करें:

char **keys= mmap(NULL, ...); 
char *str= (char*) (&keys[0]) + (ptrdiff_t) keys[0]; 

यह थोड़ा बोझिल है, लेकिन यह क्या mmap रिटर्न की परवाह किए बिना काम करता है।

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