Comment puis-je obtenir plusieurs appels à sem_open en C?

J’ai beaucoup de mal à faire fonctionner Semaphores sur un système basé sur Linux en C.

Le processus de ma demande est le suivant:

  1. L’application commence
  2. Fourches d’application en enfant / parent
  3. Chaque processus utilise sem_open avec un nom commun pour ouvrir le sémaphore.

Si je crée le sémaphore avant de foncer, cela fonctionne bien. Cependant, les exigences m’empêchent de le faire. Lorsque j’essaie d’appeler sem_open pour la deuxième fois, j’obtiens une erreur “Permission Denied” (via errno ).

Est-il possible de faire cela de quelque façon? Ou existe-t-il un moyen d’ouvrir le sémaphore dans un processus et d’utiliser un mécanisme de mémoire partagée pour le partager avec le processus enfant?

Utilisez-vous la version 4 parameters ou 2 parameters de sem_open?

Assurez-vous d’utiliser la version à 4 parameters et utilisez un mode permettant aux autres processus d’ouvrir le sémaphore. En supposant que tous les processus appartiennent au même utilisateur, un mode de 0600 ( S_IRUSR | S_IWUSR ) sera suffisant.

Vous pouvez également vérifier que vous ne masquez aucune des permissions nécessaires.

N’oubliez pas de spécifier le paramètre mode et value lorsque vous utilisez O_CREAT dans les indicateurs. Voici un exemple de travail:

 #include  #include  #include  #include  #include  #include  #include  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; }