2010-02-19 21 views
7

Ben CC dilinde çalışan sem_open'e nasıl birden fazla çağrı alabilirim?

benim uygulamanın işlem bir Linux tabanlı sistem üzerinde çalışmak için Semaphore alma zorluğu bir sürü yaşıyorum şekildedir:

  1. Uygulama çocuğa içine
  2. Uygulama çatalları başlar/Üst
  3. Her işlem, semaforu açmak için ortak bir ada sahip sem_open kullanır.

Ekspreslemeden önce semafor oluşturursam iyi çalışır. Ancak, gereksinimlerim bunu yapmamı engelliyor. Ikinci kez sem_open aramaya çalıştığımda, "İzin Reddedildi" hatası alıyorum (errno aracılığıyla).

Bunu herhangi bir şekilde yapmak mümkün mü? Ya da semaforu tek bir süreçte açmak için herhangi bir yol var mı ve çocuk süreci ile paylaşmak için paylaşılmış bir hafıza mekanizması mı kullandı?

cevap

7

Sem_open'ın 4 parametresi veya 2 parametre sürümünü mi kullanıyorsunuz?

4 parametre sürümünü kullandığınızdan ve diğer işlemlerin semaforu açmasına izin verecek bir mod kullandığınızdan emin olun. Tüm süreçlerin aynı kullanıcıya ait olduğu varsayıldığında, bir 0600 (S_IRUSR | S_IWUSR) modu yeterli olacaktır.

Ayrıca, umask'ın gerekli izinlerden herhangi birini maskelemedığını da doğrulamak isteyebilirsiniz.

+0

Dört bağımsız değişken sürümünü kullanıyordum, ancak izinlerim hatalıydı. Gördüğüm her örnekte gösterilmesine rağmen, O_RDWR'nin kullanacağı izin bayrağı değil. Çok teşekkür ederim. –

7

Bayraklarda O_CREAT kullanılırken mod ve değer parametresini belirtmeyi unutmayın. İşte bir çalışma örneği:

#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; 
} 
İlgili konular