Tom's Guide > Forum > Programmation > Pro du Linux - Help pour 2 alarmes et sémaphores

Pro du Linux - Help pour 2 alarmes et sémaphores

Forum Programmation : Pro du Linux - Help pour 2 alarmes et sémaphores

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Voila, je pense que ca doit etre connu le problème de la piscine : Une piscine possède 5 paniers et 3 cabines..Pour pouvoir se baigner un nageur doit d'abord prendre un panier, ensuite attendre la libération d'une cabine, se changer (en 3sec), se baigner (pdt 5 sec).. ensuite attendre de nouveau la libération d'une cabine.. se rhabiller et enfin rendre son panier et sortir..le programme père demande en boucle à l'utilisateur s'il veut créer un nouveau nageur ou quitter !

-Avec fonction sleep et les sémaphores

Voici la solution :

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <signal.h>

// definition necessaire pour utiliser correctement semctl
// depend de la version du systeme

#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including <sys/sem.h> */
#else
/* according to X/OPEN we have to define it ourselves */
union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* array for GETALL, SETALL */
/* Linux specific part: */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#endif

#define PANIER 0
#define CABINE 1

int sem1; //pour la fonction bye2


static int initialisation(int sem_id, int sem_num, int init);
int down(int sem_id, int sem_num);
int up(int sem_id, int sem_num);
static void Baignade(int sem_id);
void bye(int n);
void bye2(int n);

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

sem1 = semget(IPC_PRIVATE, 2, 0660 | IPC_CREAT);

if (sem1 == -1)
{
perror ("Erreur à la création du sémaphore" );
return 1;
}

initialisation(sem1,PANIER,5);
initialisation(sem1,CABINE,3);

printf ("Taper q pour quitter\n" );
printf (" c pour créer un nouveau baigneur\n" );

while(1){
fflush(stdin);
scanf("%c",&rep);

if (rep == 'q'){
break;
}
else if (rep == 'c'){
if (fork () == 0){
Baignade(sem1);
return 0;
}
}
}

// attend la mort de tous les baigneurs
while(p!=-1) {
p=wait();
}
// supprime les sémaphores
semctl (sem1, PANIER, IPC_RMID);
semctl (sem1, CABINE, IPC_RMID);

return 0;
}

static int initialisation(int sem_id, int sem_num, int init){

union semun sem_union;
sem_union.val=init;
if (semctl(sem_id, sem_num, SETVAL, sem_union) == -1) return(0);
return(1);
}

int down(int sem_id, int sem_num)
{
struct sembuf sem;
sem.sem_num=sem_num;
sem.sem_op=-1;
sem.sem_flg=0;
if(semop(sem_id, &sem, 1)==-1)
{
printf("\nErreur down! \tsem_num:%i\tsem_id:%i", sem_num, sem_id);
return -1;
}else
{
return 0;
}
}

int up(int sem_id, int sem_num)
{
struct sembuf sem;
sem.sem_num=sem_num;
sem.sem_op=1;
sem.sem_flg=0;
if(semop(sem_id, &sem, 1)==-1)
{
printf("\nErreur (up)!\tsem_num:%i\tsem_id:%i", sem_num, sem_id);
return -1;
}else
{
return 0;
}
}

static void Baignade(int sem_id)
{
int res, pid;

pid = getpid();
printf ("Baigneur '%d' entre\n", pid);

signal(SIGALRM,bye);
alarm (10);
printf ("Baigneur '%d' attend un panier\n", pid);
down(sem_id, PANIER);
printf ("Baigneur '%d' attend une cabine\n", pid);
signal(SIGALRM,bye2);
down(sem_id, CABINE);
alarm(0);
printf ("Baigneur '%d' se déshabille\n", pid);
sleep(3);
up(sem_id, CABINE);
printf ("Baigneur '%d' nage\n", pid);
sleep(5);
down(sem_id, CABINE);
printf ("Baigneur '%d' se rhabille\n", pid);
sleep(3);
up(sem_id, CABINE);
up(sem_id, PANIER);
printf ("Baigneur '%d' sort\n", pid);
exit(0);

}

void bye(int n) {
fflush(stdout);
printf("10 secondes d'attente, bye\n" );
exit(0);
}

void bye2(int n) {
fflush(stdout);
printf("10 secondes d'attente, je libère mon panier, bye\n" );
up(sem1,PANIER);
exit(0);
}


Maintenant la question est comment adapter pour que tout les 15 secondes on fasse un nettoyage de la piscine et donc les nageurs sortent momentanément de l'eau.. le nettoyage durant 4 sec...???

Avez vous deja programmer un truc dans le style?? Avez vous des idées???

Moi je dis qu'il faudrait une deuxième alarme ! Mais comment faire sachant qu'une nouvelle alarme annule la précedente !! :-?

Merci de toutes vos réponses !

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Up :

Je sais c'est long a lire... mais un petit effort pour moi :-D...

Enfin, personne ne peut m'aider??? Thanks d'avance :-)

Répondre à subenum1

Salut !
Tu pourrais detailler ta structure : struct sembuf
a++

Arno

Répondre à -arno-
Tom's Guide > Forum > Programmation > Pro du Linux - Help pour 2 alarmes et sémaphores
Aller à :

Il y a 2702 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens