Forum Programmation.c Sémaphore SystemV...

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
10
août
2004
Bonjour,


Mon programme C est confronté à un problème typique de readers/writers devant accéder à la même ressource.

J'utilise donc les sémaphores et j'en crée deux dans le main :

semid = semget (IPC_PRIVATE, 2, 0666);
if (semid < 0)
{
perror("semget planté");
exit(EXIT_FAILURE);
}
up(0);
up(1);


La fonction up est


int up(int sem_nbr)
{
struct sembuf buf;
buf.sem_num = sem_nbr;
buf.sem_op = 1;
if ((semop(semid, &buf, 1)) < 0)
{
printf("semup failed on %d!!\n", sem_nbr);
fflush(NULL);
exit(EXIT_FAILURE);
}
printf("Up on sem %d\n",sem_nbr);
fflush(NULL);
return 0;
}


(à noter que down est la même chose avec -1 à la place de 1)

Et là, quand j'utilise les up et down dans mes readers, après un certain temps variables (différent à chaque exécution), les sémaphores restent à 0 et ne remontent plus à 1, bloquant le programme.
Parfois, il me dit qu'il n'a pas accès au sémaphore.

Cela se produit généralement à la deuxième ou troisième instance du reader, parfois plus tôt, parfois plus tard.

Bizarement, le fait de rajouter le fflush dans la fonction up a nettement réduit ces erreurs et certaines fois le programmes arrive jusqu'au bout de son exécution.

Qqn a une tentative d'explication à ce phénomène ?
  • # Ah les inits

    Posté par  . Évalué à 3.

    M'est avis que :

    1) Faudrait initialiser le semaphore avant de l'utiliser (semctl est ton ami)
    2) Faudrait aussi initialiser buf.sem_flg dans up et down avant d'appeler semop

    Le compilo va pas initiliaser ces valeurs pour toi et tu te retrouves avec des valeurs prises au hasard selon l'emplacement des buffers, d'ou le comportement aleatoire que tu vois.
    • [^] # Re: Ah les inits

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      Yep, j'ai trouvé mon erreur effectivement hier soir.

      Une erreur de copier coller qui faisait que je n'initialisais pas sem_flg dans up, mais bien dans down. C'est quand même con... (d'avoir gaché un message pour ça) mais je devais être vraiment à la masse.

      Merci pour ta réponse :)

      Mes livres CC By-SA : https://ploum.net/livres.html

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.