URL: https://linuxfr.org/forums/programmationautre/posts/les-s%C3%A9maphores-nomm%C3%A9s Title: les sémaphores nommés Authors: nas Date: 2006年02月23日T20:25:03+01:00 Tags: Score: 0 je voudrais savoir si c'est possible d'utiliser des sémaphores nommés sur linux (suse 8.1). lorsque je tape sur le terminal : man sem_open j'ai ceci en résultat : linux:/ # man sem_open Aucune entrée de manuel pour sem_open le programme ci-dessous tourne bien sur Tru64 UNIX V5.0A mais sur linux (suse 8.1) la compilation se passe bien mais à l'éxecution j'ai comme erreur le message suivant : Erreur de segmentation ! je compile avec la ligne suivante : gcc -v -g -lrt shmsem.c la bibliothèque semaphore.h existe bien dans le dossier /usr/include/ voici le programme: /*shmsem.c*/ #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #include <semaphore.h> #include <sys/stat.h> #define gotoxy(x,y)printf("033円[%d;%dH",y,x); caddr_t pg_addr,pg_addr2; sem_t *mysemp; sem_t *mycpt; int fd,fd2; typedef struct p{ char nom[20]; char prenom[20]; int age; }FICHE; void Menu(void); void Ecrire(void); void shmsem(void); void Lire(void); void Quitter(void); void Menu(void) { gotoxy(30,1); printf("***** M E N U *****\n"); gotoxy(20,3); printf("Tapez (1) Ecrire:?\n"); gotoxy(20,5); printf("Tapez (2) Lire:?\n"); gotoxy(20,7); printf("Tapez (3) Quitter:?\n"); gotoxy(20,9); printf("Votre choix : "); } /* prendre le sémaphore encoder puis libérer le sémaphore. pendant que le processus écrit les autres sont bloqués */ void shmsem(void) { int size = 5*sizeof(FICHE); int size2 =sizeof(int); /* int semid, nsems, semflg, CLE; key_t key; /*création de la première mémoire partagée*/ /************************************************/ fd = shm_open("example", O_RDWR|O_CREAT,S_IRWXO|S_IRWXG|S_IRWXU); if (fd < 0) { perror("open error "); exit(0); } if ((ftruncate(fd, size)) == -1) { perror("ftruncate failure"); exit(0); } /*Allocation de la mémoire partagée*/ pg_addr = (caddr_t) mmap(0, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED,fd, 0); if (pg_addr == (caddr_t) -1) { perror("mmap failure"); exit(0); } /**************************************************/ /*création de la deuxième mémoire partagée*/ fd2 = shm_open("example2", O_RDWR|O_CREAT,S_IRWXO|S_IRWXG|S_IRWXU); if (fd2 < 0) { perror("open error"); exit(0); } if ((ftruncate(fd2, size2)) == -1) { perror("ftruncate failure"); exit(0); } /*Allocation de la mémoire partagée*/ pg_addr2 = (caddr_t) mmap(0, size2, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED,fd2, 0); if (pg_addr2 == (caddr_t) -1) { perror("mmap failure"); exit(0); } /*le sémaphore initial*/ mysemp = sem_open("mysemp", O_CREAT | O_RDWR, 0644, 1); if (mysemp == (void *)-1) { perror("sem_open() failed "); } /*le sémaphore compteur*/ mycpt = sem_open("mycpt", O_CREAT | O_RDWR, 0644, 0); if (mycpt == (void *)-1) { perror("sem_open() failed "); } sem_post(mycpt);/*incrémentation du sémaphore compteur*/ } void Ecrire(void) { FICHE nouveau; int a,val; char n[20], p[20]; /* ATTENTE DU SEMA : SEM_WAIT */ printf ("En attente.....\n"); sem_wait(mysemp); fflush(stdout); fflush(stdin); printf ("ECRITURE\n"); fflush(stdin); printf("Nom:"); scanf("%s",&n); fflush(stdin); printf("Prenom:"); scanf("%s",&p); printf("Age:"); scanf("%d",&a); strcpy(nouveau.nom, n); strcpy(nouveau.prenom, p); nouveau.age=a; val=*pg_addr2; memcpy(pg_addr+(val*sizeof(FICHE)), &nouveau, sizeof(FICHE)); if(val==5) { val=0; *pg_addr2=val; } else { val++; *pg_addr2=val; } /* LIBERATION DU SEMA : SEM_POST */ sem_post(mysemp); } /* prendre le sémaphore, lire, afficher et libérer le sémaphore. pendant que le processus lit les autres sont bloqués */ void Lire(void) { FICHE pers; int i; printf ("LECTURE\n"); /* ATTENTE DU SEMA : SEM_WAIT */ printf ("En attente......\n"); sem_wait(mysemp); for(i=0;i<5;i++) { memcpy(&pers, pg_addr+(i*sizeof(FICHE)), sizeof(FICHE)); printf ("Nom : %s\t Prenom : %s\t Age : %d\n",pers.nom,pers.prenom,pers.age); } /* LIBERATION DU SEMA : SEM_POST */ sem_post(mysemp); fflush(stdin); getchar(); } /* le dernier processus qui reste doit détruire toutes les ressources : mémoire partagée et sémaphore. */ void Quitter(void) { int val; sem_wait(mycpt); sem_getvalue(mycpt,&val); if(val==0) { sem_unlink ("mysemp"); sem_unlink("mycpt"); shm_unlink("example"); shm_unlink("example2"); sem_close(mysemp); sem_close(mycpt); close(fd); close(fd2); } } int main(void) { char car; shmsem(); do { printf("033円[2J"); Menu(); /* ignore tous les caracteres non alphanumeriques */ while(!isalnum(car=getchar())); switch (car) { case '1': Ecrire(); break; case '2': Lire(); break; case '3': Quitter(); break; default: fprintf(stderr,"%c: commande inconnue !\n",car); } }while (car != '3'); getchar(); return 0; } Apparemment le problème est dû aux sémaphores nommés, donc ma question est de savoir comment pourrais-je procéder à la réecriture du programme pour linux merci pour votre aide !!!