2012-04-01 15 views
5

मैं एक struct है:सी में साझा स्मृति (shmget/shmat) को कैसे संशोधित करें?

size_t shmsize = sizeof(struct sdata); 
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666); 

तो मैं इस तरह साझा स्मृति का उपयोग:

struct sdata *data = shmat(shared.shmid, (void *) 0, 0); 
data->time = time(NULL); // function returns the current time 

मेरा प्रश्न है

struct sdata { 
    int x; 
    int y; 
    time_t time; 
}; 

इस प्रकार मैं struct के लिए साझा स्मृति बनाने बहुत साधारण। क्या साझा स्मृति को एक्सेस/संशोधित करने का यह सही तरीका है? क्या यह सबसे अच्छा तरीका है?

(मैं तुल्यकालन के लिए सिस्टम वी सेमाफोर का उपयोग कर रहा हूँ और मैं तो नहीं डाला है कोड। मैं सिर्फ यकीन है कि मुझे तक पहुँचने हूँ/साझा स्मृति को संशोधित करने के लिए सही ढंग से बनाना चाहते थे।)

उत्तर

2

यह सही है, नोट की एकमात्र चीज यह है कि आप एक निजी साझा मेमोरी सेगमेंट बना रहे हैं, जिसका अर्थ है कि आपको शर्मिड को किसी भी अन्य प्रक्रिया में ट्रांसमिट करना होगा जिसे आप इसका उपयोग करना चाहते हैं।

+1

यदि अन्य प्रक्रिया 'कांटा() 'ed है, तो आईपीसी_PRIVATE के साथ कोई समस्या नहीं है जब तक कि साझा स्मृति' फोर्क()' से पहले बनाई गई हो। हालांकि, चेतावनी अधिक सामान्य मामले में मान्य है। –

4

हाँ, यह एक तरीका है उस साझा स्मृति को बनाएं, फिर एक्सेस करें या संशोधित करें। हालांकि, आपके पास सिंक्रनाइज़ेशन समस्याएं हो सकती हैं, और आप उदा। उस के लिए Posix semaphores। पहले sem_overview(7) मैन पेज देखें।

+0

धन्यवाद। मैं सिंक्रनाइज़ेशन के साथ ठीक हूँ। मैं बस "डेटा-> समय = समय (शून्य), या डेटा-> x = 5" करने के बारे में चिंतित था और यह कुछ गड़बड़ कर रहा था। – bfresh