2012-05-21 13 views
11

में एक से अधिक स्वतंत्र कार्यक्रमों के बीच समान चर साझा करना मैं लिनक्स में एक से अधिक स्वतंत्र सी निष्पादन योग्य के बीच एक चर साझा करना चाहता हूं। यही है, एक प्रोग्राम एक सरणी पर लिखता है और ध्वज सेट करता है ताकि कोई अन्य प्रोग्राम इसका उपयोग न कर सके, और इस ऑपरेशन के बाद यह ध्वज को अनसेट कर देगा और फिर दूसरा प्रोग्राम सरणी पढ़ेगा। मैंने प्रत्येक प्रोग्राम में एक ही कस्टम हेडर फ़ाइल (वेरिएबल युक्त) का उपयोग करने का प्रयास किया, लेकिन ऐसा लगता है कि प्रोग्राम्स के आने पर चर के विभिन्न उदाहरण बनाए जाते हैं।लिनक्स

+8

संकेत: आईपीसी (इंटरप्रोसेस संचार), यहां एक उत्तर में संबोधित करने के लिए यह एक विषय है। – Nim

+2

हां, हो सकता है कि आप एक नज़र डालें [यहां] (http://en.wikipedia.org/wiki/Inter-process_communication)। विभिन्न प्रक्रियाओं में दो स्वतंत्र निष्पादन योग्य लॉन्च किए जाते हैं, इसलिए आपको [सॉकेट] (http://www.cs.cf.ac.uk/Dave/C/node28.html) का उपयोग करके, उनके बीच कुछ प्रकार के संचार को लागू करना होगा। , [पाइप] (http://www.cs.cf.ac.uk/Dave/C/node23.html), आदि ... या यहां तक ​​कि फाइलें भी। –

+0

मैं देखता हूं। इसका मतलब है, इस मामले में पाइप का इस्तेमाल किया जाना चाहिए। क्या कोई आसान तरीका है? –

उत्तर

14

आपके हेडर में घोषित वेरिएबल्स एक प्रतिलिपि बनाएंगे जहां आप उन्हें कभी भी शामिल करेंगे (unless you declare them extern)। बेशक, अलग प्रक्रियाओं से निपटने पर हर प्रक्रिया में अपनी याददाश्त की जगह होगी। आपको इसे रोकने के लिए और अधिक परिष्कृत तकनीकों का उपयोग करने की आवश्यकता है, यानी इंटर प्रोसेस कम्युनिकेशन (आईपीसी)। उदाहरण के लिए:

  • (नाम) पाइप्स
  • सॉकेट
  • साझा मेमोरी

आपका प्रश्न shared memory की तरह पढ़ता है, तुम क्या चाहते है, क्योंकि इसके द्वारा कई प्रक्रियाओं साझा करने के लिए एक ही स्मृति क्षेत्रों तक पहुँच सकते हैं कुछ चर शायद this question पर एक नज़र डालें और इसके उदाहरण के लिए उत्तर दें।

आपके प्रोग्राम को कुछ साझा मेमोरी बनाने की आवश्यकता होगी, उदा। shmget का उपयोग करके और shmat का उपयोग कर साझा स्मृति ऑब्जेक्ट को संलग्न करने के लिए। जब एकाधिक प्रक्रियाएं समान स्मृति क्षेत्रों तक पहुंचती हैं, तो वे चर पर पढ़ने/लिखने के दौरान प्रक्रिया सिंक्रनाइज़ेशन जोड़ने के लिए हमेशा एक स्वस्थ दृष्टिकोण है, उदा। एक साझा सेमफोर (semget, semop) का उपयोग करना।

जब आप अपनी साझा मेमोरी के साथ होते हैं तो आपको इसे अलग करने की आवश्यकता होती है (shmdt)। इस प्रकार आप कर्नेल को बताते हैं कि आपकी प्रक्रिया को अब तक पहुंच की आवश्यकता नहीं है। साझा स्मृति/सेमफोर ऑब्जेक्ट बनाने वाली प्रक्रिया को भी आपके प्रोग्राम के अंत में उन्हें नष्ट करने की आवश्यकता है। अन्यथा यह स्मृति में तब तक रहेगा, जब तक कि आप अपनी मशीन को रीबूट न ​​करें (shmctl, semctl देखें, खासकर IPC_RMID)।

ध्यान दें कि साझा मेमोरी ऑब्जेक्ट्स "पिछली प्रक्रिया को समाप्त करने के बाद सेगमेंट केवल नष्ट हो जाएगा"। तो आप यह सुनिश्चित करना चाहते हैं कि यह वास्तव में आपकी सभी प्रक्रियाओं के लिए होता है (shmdt)।

सिस्टम वी साझा स्मृति (shmget (2), shmop (2), आदि) एक पुराने साझा स्मृति एपीआई है:


टिप्पणियों के जवाब में, यहाँ POSIX दृष्टिकोण है। POSIX साझा स्मृति एक सरल, और बेहतर डिजाइन इंटरफेस प्रदान करता है; दूसरी ओर POSIX साझा स्मृति कुछ हद तक कम व्यापक रूप से उपलब्ध है (विशेष रूप से पुराने सिस्टम पर) सिस्टम वी साझा स्मृति से।

  • shm_open - स्मृति
  • sem_open के लिए सूचक प्राप्त करने के लिए - - साझा स्मृति
  • mmap के आकार को निर्धारित करने के लिए - साझा करने के लिए स्मृति (फ़ाइल वर्णनकर्ता के माध्यम से)
  • ftruncate को एक सेमफोर
  • sem_wait, sem_post - आपके पढ़ने/लिखने के सिंक्रनाइज़ेशन के लिए
  • shm_unlink, sem_close - सभी

के बाद साफ करने के लिए यह भी देखें this overview और here उदाहरण के लिए।

अंत में, ध्यान दें कि

POSIX साझा स्मृति वस्तुओं गिरी हठ है: जब तक सिस्टम को बंद कर रहा है एक साझा स्मृति वस्तु उपलब्ध नहीं होगा, या जब तक सभी प्रक्रियाओं तुच्छ वस्तु है और यह shm_unlink साथ हटा दिया गया है (3)


आदेश को ध्यान में, साझा स्मृति वस्तुओं के हठ लेने के लिए अपने आवेदन करने के लिए संकेत संचालकों को जोड़ने के लिए है कि एक अपवाद के मामले में साफ ऊपर कार्रवाई करने जाएगा मत भूलना में अल समाप्ति (SIGINT, SIGTERM आदि)।

+3

'shmget' का उपयोग न करें, इसके बजाय posix 'shm_open' का उपयोग करें। यह उपयोग करने के लिए बहुत कम दर्दनाक है, और कुंजी टकराव की समस्या नहीं है – Hasturkun

+0

@Hasturkun - टिप्पणी के लिए धन्यवाद! मैंने अब तक इनका उपयोग नहीं किया है, लेकिन मैंने पूर्णता के लिए इस पर एक नोट जोड़ा। – moooeeeep

+0

धन्यवाद moooeeeep। –

6

shm_open और shm_unlink के माध्यम से POSIX साझा स्मृति का उपयोग कर में देखो ... मैं व्यक्तिगत रूप से लगता है कि उन्हें उपयोग करने के लिए आसान और अधिक से सीधी-सपाट हैं पुराने सिस्टम-वी आईपीसी कॉल ऐसे shmget, आदि के बाद से संभाल काम करता है वास्तव में वापसी हुई फ़ाइल-डिस्क्रिप्टर की तरह आप read, write इत्यादि जैसे कॉल के साथ उपयोग कर सकते हैं। अन्यथा, यदि आप सामान्य पॉइंटर्स के माध्यम से फ़ाइल-डिस्क्रिप्टर द्वारा साझा की गई साझा मेमोरी ऑब्जेक्ट तक पहुंच चाहते हैं, तो आप shm_open द्वारा लौटाए गए फ़ाइल-डिस्क्रिप्टर पर mmap का उपयोग कर सकते हैं ।