2009-11-04 8 views
6

मैं एक ऐसा प्रोग्राम लिखने का प्रयास कर रहा हूं जिसमें बच्चे लिनक्स पर एक-दूसरे के साथ संवाद कर सकें।सी में साझा स्मृति में कोई int और सरणी कैसे रखता है?

ये प्रक्रियाएं एक ही प्रोग्राम से बनाई गई हैं और जैसे ही वे कोड साझा करते हैं।

मुझे उन्हें दो पूर्णांक चर के साथ-साथ एक पूर्णांक सरणी तक पहुंचने की आवश्यकता है।

मुझे नहीं पता कि स्मृति मेमोरी कैसे काम करती है और मैंने जो भी संसाधन खोजा है, उसने मुझे कुछ भी नहीं किया है।

किसी भी मदद की सराहना की जाएगी!

संपादित करें: यहां एक कोड का उदाहरण दिया गया है जिसे मैंने अभी तक एक int साझा करने के लिए लिखा है लेकिन यह शायद गलत है।

int segmentId; 
int sharedInt; 
const int shareSize = sizeof(int); 
/* Allocate shared memory segment */ 
segmentId = shmget(IPC_PRIVATE, shareSize, S_IRUSR | S_IWUSR); 

/* attach the shared memory segment */  
sharedInt = (int) shmat(segmentId, NULL, 0); 

/* Rest of code will go here */ 

/* detach shared memory segment */ 
shmdt(sharedInt); 
/* remove shared memory segment */ 
shmctl(segmentId, IPC_RMID, NULL); 
+4

कौन सा ऑपरेटिंग सिस्टम: साझा स्मृति का उपयोग करने के संकेत दिए गए के उपयोग पर ध्यान दें - तो, ​​आप इन पंक्तियों (अपने कोड उदाहरण से कंकाल के कुछ cribbing) के साथ अपने दो चर की ओर इशारा और सरणी बना सकते हैं? –

+1

मेरी गलती। यह लिनक्स – Josh

+0

पर है कल से इस प्रश्न को नोट करें: http://stackoverflow.com/questions/1664519/creating-accessing-shared-memory-in-c (वही सामान्य विषय, हालांकि आपने Sys V IPC चुना है)। –

उत्तर

6

आपको अपनी साझा मेमोरी के आकार को बढ़ाने की आवश्यकता होगी। आपको कितनी बड़ी सरणी चाहिए? जो भी मूल्य है, आपको साझा मेमोरी सेगमेंट बनाने से पहले इसे चुनने की आवश्यकता होगी - डायनामिक मेमोरी यहां बहुत अच्छी तरह से काम नहीं करेगी।

जब आप साझा स्मृति से संलग्न होते हैं, तो आपको प्रारंभ पते पर एक सूचक मिलता है। यह किसी भी उद्देश्य के लिए इस्तेमाल होने के लिए पर्याप्त रूप से अच्छी तरह से गठबंधन किया जाएगा।

enum { ARRAY_SIZE = 1024 * 1024 }; 
int segmentId; 
int *sharedInt1; 
int *sharedInt2; 
int *sharedArry; 

const int shareSize = sizeof(int) * (2 + ARRAY_SIZE); 
/* Allocate shared memory segment */ 
segmentId = shmget(IPC_PRIVATE, shareSize, S_IRUSR | S_IWUSR); 

/* attach the shared memory segment */  
sharedInt1 = (int *) shmat(segmentId, NULL, 0); 
sharedInt2 = sharedInt1 + 1; 
sharedArry = sharedInt1 + 2; 

/* Rest of code will go here */ 
...fork your child processes... 
...the children can use the three pointers to shared memory... 
...worry about synchronization... 
...you may need to use semaphores too - but they *are* complex... 
...Note that pthreads and mutexes are no help with independent processes... 

/* detach shared memory segment */ 
shmdt(sharedInt1); 
/* remove shared memory segment */ 
shmctl(segmentId, IPC_RMID, NULL); 
+0

यह बहुत अच्छा लग रहा है। बहुत बहुत धन्यवाद! – Josh

0

यह मार्गदर्शिका उपयोगी दिखती है: http://www.cs.cf.ac.uk/Dave/C/node27.html। इसमें कुछ उदाहरण प्रोग्राम शामिल हैं।

Linux man pages online भी हैं।

+0

धन्यवाद लेकिन दुर्भाग्य से यह उन पृष्ठों में से एक है जो मुझे पूरी तरह भ्रमित करते हैं। – Josh

+0

क्या आपने वहां उदाहरण कोड कॉपी और पेस्ट करने की कोशिश की है और इसे संकलित किया है? यदि आप इसे संकलित करने के लिए प्राप्त कर सकते हैं तो आप इसे समझने के लिए शायद आधे रास्ते हैं। –

+0

उस उदाहरण के साथ मेरी समस्या यह है कि यह क्लाइंट-सर्वर तरीके से बात करने वाले विभिन्न प्रोग्राम प्रतीत होता है। मैंने स्पष्ट नहीं किया था कि मुझे उस समय मेरे मूल प्रश्न में क्या चाहिए, लेकिन मेरे कोड में मैं एक ही कार्यक्रम से कई प्रक्रियाएं बनाउंगा और उन्हें संवाद करने की आवश्यकता होगी। – Josh

0

साझा स्मृति एक प्रक्रिया द्वारा आवंटित स्मृति का एक खंड है, एक अद्वितीय आईडी के साथ, और दूसरी प्रक्रिया उसी आईडी के साथ आवंटन भी करेगी, और स्मृति का आकार संरचना के आकार का है उपयोग कर रहे हैं, तो आपके पास 2 पूर्णांक और एक पूर्णांक सरणी वाला संरचना होगी।

अब दोनों के पास एक ही स्मृति के लिए एक सूचक है, इसलिए एक के लिखने से कहीं और भी ओवरराइट हो जाएगा, और दूसरे के पास तत्काल पहुंच होगी।

+0

@ जोश नो, टिप्पणी स्वरूपण मोल्डी चट्टानों को बेकार करता है - लेकिन फिर आपको टिप्पणी करने के बजाय इसे स्पष्ट करने के लिए अपना प्रश्न संपादित करना होगा, ताकि आप अपने कोड को संपादित करने में अपने कोड को प्रारूपित कर सकें और इन टिप्पणियों को हटा दें! –

+0

मैं आपको अपने मूल प्रश्न में स्पष्टीकरण जोड़ने की सलाह दूंगा। –

+0

@ जोश - आप इस ट्यूटोरियल को देखना चाह सकते हैं: http://www.ecst.csuchico.edu/~beej/guide/ipc/shmem.html, क्योंकि वह यह भी दिखाता है कि ftok का उपयोग कैसे करें कहते हैं। –

0
अपनी टिप्पणी से

यह आप IPC_PRIVATE उपयोग कर रहे हैं लगता है, और कहा कि निश्चित रूप से गलत लग रहा है (के "निजी" प्रकार का सुझाव यह साझा करने के लिए नहीं है कोई -?)। कुछ ऐसा प्रयास करें:

#include <sys/ipc.h> 
#include <sys/shm.h> 

... 

int segid = shmget((key_t)0x0BADDOOD, shareSize, IPC_CREAT); 
if (segid < 0) { /* insert error processing here! */ } 
int *p = (int*) shmat(segid, 0, 0); 
if (!p) { /* insert error processing here! */ } 
+0

यह दिलचस्प लग रहा है। जब सी की बात आती है तो मैं सबसे महान नहीं हूं तो क्या इस मामले में int सरणी होगी? मैं शर्म में आपके पास हेक्स वैल्यू के बारे में भी उत्सुक हूं। – Josh

+0

आईपीसी_PRIVATE काम करता है अगर माता-पिता साझा स्मृति बनाता है और फिर उन बच्चों को फोर्क करता है जो इसे साझा करने जा रहे हैं। –

+0

@ जोश: आपको साझा स्मृति के लिए कुंजी के रूप में 32-बिट मान की आवश्यकता है। आप या तो एक बनाने के लिए ftok() का उपयोग कर सकते हैं, या एक निश्चित नाम का चयन कर सकते हैं। कोई भी बुरा डूड किसी भी अन्य के रूप में साझा स्मृति के टुकड़े के लिए कोई नाम नहीं है। 0xDEADBEEF एक और प्रसिद्ध मूल्य है। लेकिन IPC_PRIVATE भी अच्छा है - जब तक पैरेंट प्रक्रिया फोर्किंग से पहले साझा स्मृति को बनाता है और जोड़ती है। –