2010-02-19 9 views
7

मैं कठिनाई सीसी में काम करने वाले sem_open पर मुझे एकाधिक कॉल कैसे मिल सकती हैं?

अपने आवेदन की प्रक्रिया में एक लिनक्स आधारित सिस्टम पर काम करने के लिए हो रही Semaphores का एक बहुत हो रही हैं, इस तरह के है:

  1. आवेदन बच्चे में
  2. आवेदन कांटे शुरू होता है/पैरेंट
  3. प्रत्येक प्रक्रिया सेमफोर खोलने के लिए एक आम नाम के साथ sem_open का उपयोग करता है।

अगर मैं फोर्किंग से पहले सेमफोर बना देता हूं, तो यह ठीक काम करता है। हालांकि, आवश्यकताएं मुझे ऐसा करने से रोकती हैं। जब मैं दूसरी बार sem_open पर कॉल करने का प्रयास करता हूं, तो मुझे "अनुमति अस्वीकृत" त्रुटि मिलती है (errno के माध्यम से)।

क्या यह किसी भी तरह से करना संभव है? या क्या एक प्रक्रिया में सेमफोर खोलने का कोई तरीका है और इसे बाल प्रक्रिया के साथ साझा करने के लिए साझा स्मृति तंत्र का उपयोग किया जाता है?

उत्तर

7

क्या आप sem_open के 4 पैरामीटर या 2 पैरामीटर संस्करण का उपयोग कर रहे हैं?

4 पैरामीटर संस्करण का उपयोग करना सुनिश्चित करें और एक मोड का उपयोग करें जो अन्य प्रक्रियाओं को सेमफोर खोलने की अनुमति देगा। मान लें कि सभी प्रक्रियाओं का स्वामित्व उसी उपयोगकर्ता के पास है, 0600 (S_IRUSR | S_IWUSR) का एक तरीका पर्याप्त होगा।

आप यह भी सत्यापित करना चाहते हैं कि आप umask किसी भी आवश्यक अनुमतियों को मास्किंग नहीं कर रहे हैं।

+0

मैं चार तर्क संस्करण का उपयोग कर रहा था, लेकिन मेरी अनुमतियां गलत थीं। ऐसा लगता है कि 'O_RDWR' उपयोग करने के लिए अनुमति ध्वज नहीं है, हर उदाहरण में दिखाए जाने के बावजूद मुझे मिल सकता है। बहुत बहुत धन्यवाद। –

7

झंडे में O_CREAT का उपयोग करते समय मोड और मान पैरामीटर निर्दिष्ट करना न भूलें। यहां एक कामकाजी उदाहरण है:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <semaphore.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <sys/wait.h> 

static void parent(void) 
{ 
    sem_t * sem_id; 
    sem_id=sem_open("mysem", O_CREAT, 0600, 0); 
    if(sem_id == SEM_FAILED) { 
     perror("parent sem_open"); 
     return; 
    } 
    printf("waiting for child\n"); 
    if(sem_wait(sem_id) < 0) { 
     perror("sem_wait"); 
    } 
} 

static void child(void) 
{ 
    sem_t * sem_id; 
    sem_id=sem_open("mysem", O_CREAT, 0600, 0); 
    if(sem_id == SEM_FAILED) { 
     perror("child sem_open"); 
     return; 
    } 
    printf("Posting for parent\n"); 
    if(sem_post(sem_id) < 0) { 
     perror("sem_post"); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid < 0) { 
     perror("fork"); 
     exit(EXIT_FAILURE); 
    } 

    if(!pid) { 
     child();  
    } else { 
     int status; 
     parent(); 
     wait(&status); 
    } 
    return 0; 
} 
संबंधित मुद्दे