2011-12-12 17 views
7

मैं एक साझा सर्किट के रूप में (गोलाकार) कतार (सी में) को डिजाइन/कार्यान्वित करने का प्रयास कर रहा हूं ताकि इसे एकाधिक थ्रेड/प्रक्रियाओं के बीच साझा किया जा सके।एक साझा मेमोरी होने के लिए एक कतार डिजाइन करना

typedef struct _q { 
    int q_size; 
    int q_front; 
    int q_rear; 
    int *q_data; 
}queue; 

कौन सा निम्नलिखित कार्यों का समर्थन करता है:

int empty_q(queue *q); 
int display_q(queue *q); 
int create_q(queue **q, int size); 
int delete_q(queue **q); 
int enqueue(queue *q, int data); 
int dequeue(queue *q, int *data); 

प्रति कतार आकार उपयोगकर्ता द्वारा उल्लेख किया है, q_data के लिए स्मृति create_q में आवंटित किया जाएगा

कतार संरचना इस प्रकार है()।

प्रश्न: "sys/shm.h" में प्रदान किए गए सिस्टम फ़ंक्शंस का उपयोग करके इस कतार के लिए साझा स्मृति कैसे बनाएं? Shmget(), shmat(), shmctl(), आदि का उपयोग कर कतार डेटा-संरचना के लिए साझा मेमोरी बनाने/हटाने/पुनर्प्राप्त/हटाने के लिए कोई भी कोड स्निपेट/उदाहरण बहुत मददगार होगा।

+0

यदि आप कतार जैसी तंत्र का उपयोग करके प्रक्रियाओं को संवाद करना चाहते हैं, तो [संदेश कतार] (http://www.it.uom.gr/teaching/c_marshall/node25.html) का उपयोग करना बेहतर नहीं होगा? एक ही प्रक्रिया से धागे के पार, एक महत्वपूर्ण खंड द्वारा संरक्षित मानक कतार –

+0

@dario_ramos संदेश कतार इस समस्या के लिए एक आदर्श समाधान होगा .. लेकिन मैं एक कतार का उपयोग करके उदाहरण देने की कोशिश कर रहा हूं कि कैसे संलग्न किया जाए एक साझा स्मृति के साथ एक डेटा संरचना। –

+0

उस स्थिति में, जब मैंने यूनिक्स आईपीसी के साथ गड़बड़ की, तो मैंने [यूनिक्स आईपीसी के लिए बीज की मार्गदर्शिका] (http://beej.us/guide/bgipc/) का पालन किया। इसमें कुछ चुटकुले भी हैं! आप सीधे [साझा स्मृति अनुभाग] (http://beej.us/guide/bgipc/output/html/multipage/shm.html) –

उत्तर

2

जब मैं यूनिक्स आईपीसी के साथ गड़बड़ है, मैं Beej's guide to Unix IPC का पालन किया। इसमें कुछ चुटकुले भी हैं! आप सीधे shared memory section पर जा सकते हैं। इसमें स्निपेट प्रत्येक चरण को समझाते हैं, और अंत में एक पूर्ण उदाहरण है।

+0

बीज की मार्गदर्शिका भयानक है। साझा करने के लिए धन्यवाद। :) –

+0

मैंने इसे भी संदर्भित किया .. अपेक्षाकृत अच्छी जानकारी। –

+0

आपके लिए अच्छा, अधिक विस्तृत संदर्भ की तरह दिखता है। थोड़ा सा विवरण: अपने लिंक से "<" and ">" निकालें, अन्यथा यह काम नहीं करेगा (मैं दस्तावेज़ देख सकता था क्योंकि मैंने यूआरएल संपादित किया था) –

4

यहां एक साधारण उदाहरण है जो साझा स्मृति को संरचना के आकार को बनाता है, इसमें कुछ डेटा लिखता है और इसे प्रिंट करता है। एक उदाहरण चलाएं और यह साझा मेमोरी बनाएगा और इसमें कुछ "डेटा" डालेगा, और फिर एक कुंजी प्रेस की प्रतीक्षा करें। एक अलग कमांड प्रॉम्प्ट में दूसरा उदाहरण चलाएं, और दूसरा उदाहरण स्मृति की सामग्री मुद्रित करेगा।

typedef struct 
    { 
    char a[24]; 
    int i; 
    int j; 
    } somestruct; 


void fillshm(int shmid) { 
    somestruct *p; 

    if ((p = shmat (shmid, NULL, 0)) < 0) 
     { 
     perror("shmat"); 
     exit(1); 
     } 

    printf("writing to shared memory\n"); 
    strcpy(p->a, "my shared memory"); 
    p->i = 123; 
    p->j = 456; 
} 


void printshm(int shmid) 
{ 
    somestruct *p; 
    if ((p = shmat (shmid, NULL, 0)) < 0) 
     { 
     perror("shmat"); 
     exit(1); 
     } 

    printf("%s, %d, %d\n", p->a, p->i, p->j); 
} 

int main(int argc, char *argv[]) { 

    int shmid; 

    // see if the memory exists and print it if so 
    if ((shmid = shmget (1234, 0, 0)) >= 0) 
     printshm(shmid); 
    else 
     { 
     // didn't exist, so create it 
     if ((shmid = shmget (1234, sizeof(somestruct), IPC_CREAT | 0600)) < 0) 
     { 
     perror("shmget"); 
     exit(1); 
     } 

     printf("shmid = %d\n", shmid); 

     fillshm(shmid); 
     printf("Run another instance of this app to read the memory... (press a key): "); 
     getchar(); 

     // delete it 
     if (shmctl (shmid, IPC_RMID, NULL) < 0) 
     { 
     perror("semctl"); 
     exit(1); 
     } 
     } 

    return 0; 
} 
+0

उदाहरण के लिए धन्यवाद। यह सही है (लेकिन अधूरा)। एक संरचना को एक साझा स्मृति में संलग्न/संबद्ध करने के बारे में कोई विचार? –

+0

@ संगीत सरवनराज: एक सूचक को एक सूचक को स्मृति को असाइन करें। एक मॉलोक कॉल से स्मृति के समान। आपको यह सुनिश्चित करने की ज़रूरत है कि प्रत्येक प्रक्रिया में संरचना की एक समान परिभाषा हो (उसी पैकिंग के साथ)। –

+0

@ संगीत सरवनराज: मज़े के लिए, मैंने एक संरचना का उपयोग करने के लिए उदाहरण थोड़ा अद्यतन किया और थोड़ा और रोचक होने के लिए (दो उदाहरण दो रनों की अनुमति दें और एक को स्मृति भरने के लिए और दूसरे को प्रिंट करने के लिए)। –

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