IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Besoin d'aide au sujet des semaphores [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut Besoin d'aide au sujet des semaphores
    Voila j'ai recuperer un code source comme exemple sur le net j'aimerai comprendre ce qu'il fait exactement!
    Si une ame charitable peut me repondre merci d'avance!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    pv.h
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    #include <errno.h>
     
    extern int errno;
     
    #define SEMPERM 0600
    #define TRUE 1
    #define FALSE 0
    #define SEMKEY 0*200
    #define SEMKEYSTR "0*200"
     
     
    union _semun{
     int val;
     struct semid_ds *stat;
     unsigned short *array;
    } 
     
    int p (int semid);
    int v (int semid);
    int initsem (key_t semkey);
    void handlesem (key_t semkey);
     
    ***********************
    /* initsem.c -- semaphore initialisation */
     
    #include "pv.h"
     
    int initsem(key_t semkey)
    {
        int status = 0, semid;
        union semun arg;
        arg.val = 1;
     
        if((semid = semget(semkey, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1)
        {
    	if (errno ==EEXIST)
    	    semid = semget(semkey, 1, 0);
        }
        else /* if created ... */
        {
    	status = semctl(semid, 0, SETVAL, arg);
        }
     
        if (semid == -1 || status == -1)
        {
    	perror("initsem failed");
    	return(-1);
        }
     
        /* all okay */
        else
        return(semid);
    }
    void removesem (char *key)
    {
        execlp ("ipcrm", "ipcrm", "-S", key,(char *) 0);
     
    *************************
    pc.c
    #include "pv.h"
    int p(int semid){
        struct sembuf p_buf;
     
        p_buf.sem_num = 0;
        p_buf.sem_op = -1;
        p_buf.sem_flg = SEM_UNDO; /* undoes operation if process exits! */
     
        if (semop(semid, &p_buf, 1) == -1)
        {
    	perror("p(semid) failed");
    	exit(1);
        } 
    else
    	return (0);
    }
    //p()
     
    ***************************
    vc.c
    #include "pv.h"
    int v(int semid){
        struct sembuf v_buf;
     
        v_buf.sem_num = 0;
        v_buf.sem_op = 1;
        v_buf.sem_flg = SEM_UNDO;
     
        if (semop(semid, &v_buf, 1) == -1){
    	perror("v(semid) failed");
    	exit(1);
        } else
    	return(0);
    }//v()
     
    ****************************
    testsem.c
    /* program for testing p() and v() -- gets mutual exclusion */
     
    #include "pv.h"
     
    int main(void){
      key_t semkey = SEMKEY;
     
      if(fork() == 0) handlesem(semkey);
      else if(fork() == 0) handlesem(semkey);
      else if(fork() == 0) handlesem(semkey);
     
      while (wait ((int *) 0) >=0)
      removesem (semkeystr);
      return 0;
      }//main()
     
    void handlesem(key_t skey){
      int semid, pid = getpid();
     
      /* initialize the semaphore if we just created it */
     
      if ((semid = initsem(skey)) < 0) exit(1);
     
      printf("\nprocess %d BEFORE critical section\n", pid);
     
      p(semid);
     
      printf("\nprocess %d in critical section \n", pid);
     
      sleep(10);
     
      printf("\nprocess %d leaving critical section \n", pid);
     
      v(semid); /* call semaphore SIGNAL operation */
     
      printf("\nprocess %d is OUTSIDE critical section and quitting!\n", pid);
      exit(0);
    }

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    C'est trés simple, ton programme code la notion de section critiques à l'aide de sémaphores.

    Les trois fonctions fork(), font que ton programme va se dupliquer 3 fois lors du lancement. Pour chaque instance de ton programme, le code dans la section critique (entre le p() et le v()) ne pourra s'exécuter que si aucune autre instance de ton programme n'est déjà dans cette section.

    Ce type de programmation est utilisée par exemple pour accéder à un pilote matériel. Ainsi, la section critique, empêche que plusieurs programme accèdent au pilote en même temps.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Par défaut
    Donc en fait si j'ai bien compris
    ma fonction v et p etablis les bornes de ma section critique
    Le fichier initsem.c
    initialise une valeur au semaphore et du coup etablis en meme temps les bornes de la section critique
    Le fichier testsem.c
    fait appel a 3 childs
    pour chaque child est lancé une instance de programme et verifie si une instance est deja presente
    dans la section critique et si c'est le cas il ne peut pas lancer l'instance

    C'est bien sa?
    Question: a quoi sert extern int errno, semkey, semkeystr, struct semid_ds *stat, et unsigned short *array ?

    Merci pour tes reponses c sympa

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par menzeli
    Donc en fait si j'ai bien compris
    ma fonction v et p etablis les bornes de ma section critique
    C'est exactement ça.

    Le fichier initsem.c
    initialise une valeur au semaphore et du coup etablis en meme temps les bornes de la section critique
    Pas vraiment. Oui la sémaphore est initalisée dans initsem. Par contre, la section critique elle est ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      p(semid);
     
      printf("\nprocess %d in critical section \n", pid);
     
      sleep(10);
     
      printf("\nprocess %d leaving critical section \n", pid);
     
      v(semid); /* call semaphore SIGNAL operation */
    Le fichier testsem.c
    fait appel a 3 childs
    pour chaque child est lancé une instance de programme et verifie si une instance est deja presente
    dans la section critique et si c'est le cas il ne peut pas lancer l'instance
    Non. Quoi qu'il arrive, les 3 instances de ton programmes sont crées et démarrent. Mais dés qu'une des instances arrive dans le code de la section critique, "elle" bloque les 2 autres instances qui attendent au début de leur section critique. Autrement dit, il ne peut jamais y avoir plus d'une seule instance de ton programme qui exécute en même temps le code contenu dans la section critique.

    C'est bien sa?
    Question: a quoi sert extern int errno, semkey, semkeystr, struct semid_ds *stat, et unsigned short *array ?
    Ben pour bien comprendre tout ça => et cours C.

  5. #5
    Invité de passage
    Inscrit en
    Mai 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1
    Par défaut probleme
    salut,j'ai 1 prob à traiter avant 17/05/2008:exercices avec les sémaphore :soit un systeme composé de trois processus fumeurs et d'un procrssus agent.Chaque fumeur roule continuellement une cigarette et la fume.pour pouvoir rouler une cigarette,trois ingrédients sont nécessaire:le tabac le papier et les alumettes.Un des processus fumeurs détient le papier,le 2émé processus le tabac et le 3émé les alumettes.
    le processus agent a un approvisionnement infini des trois ingrédients.L'agent place deux ingrédients distincts sur la table ainsi le fumeur qui posséde le troisiéme ingrédient peut rouler une cugarette,la fumer puis signaler à l'agent la fin de son opération.l'agent remet sur la table deux autres ingrédients et ainsi le cycle se répéte.
    q1- synchroniser les processus à l'aide des semaphores
    q2-modifier la solution pour permettre à plus d'un fumeur d'opérer en meme temps.
    j'ai fait une solution mais j'arrive pas écrire code source
    qui a la réponse aide moi sur moon_futur@hotmail.com

Discussions similaires

  1. Besoin d'aide pour compiler des sources
    Par Fabouney dans le forum C
    Réponses: 9
    Dernier message: 26/07/2006, 00h02
  2. Réponses: 45
    Dernier message: 04/05/2006, 01h10
  3. Réponses: 3
    Dernier message: 05/12/2005, 02h30
  4. Besoin d'aide pour utilisation des trie
    Par bluecurve dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2005, 08h04
  5. Besoin d'aide : afficher / cacher des layers
    Par mickeliette dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/10/2004, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo