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 :

Sémaphores et fork()


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Sémaphores et fork()
    Bonjour, je souhaite implémenter un sémaphore sur un secrétariat où une seule personne peut rentrer à la fois et N personnes doivent passer. J'ai écrit le code suivant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <semaphore.h>
    #include <time.h>
     
    int g_alea(int i_min,int i_max);
     
    int main(int argc,char **argv)
    {
        pid_t pid;
        sem_t secretariat;
        int N,i;
     
        srand(time(NULL));
     
        if(argc != 2)
            return -1;
     
        N = atoi(argv[1]);
        sem_init(&secretariat,0,1);
     
        for(i=1;i<=N;i++)
        {
            pid = fork();
            if(pid > 0)
            {
                printf("nouveau\n");
                sem_wait(&secretariat);
                printf("secretariat pour %d\n",i);
                sleep(g_alea(4,6));
                printf("on sort\n");
                sem_post(&secretariat);
                wait(NULL);
            }
            else if(pid == 0)
            {
                sleep(g_alea(1,5));
                printf("nouveau\n");
                sem_wait(&secretariat);
                printf("secretariat pour %d\n",i+1);
                sleep(g_alea(4,6));
                sem_post(&secretariat);
                exit(0);
            }
            else
                return -1;
        }
     
        return 0;
    }
     
    int g_alea(int i_min,int i_max)
    {
        int nb = i_max - i_min + 1;
        int nb2 = rand() % nb;
        return i_min + nb2;
    }
    Le problème est que le sem_wait ne se bloque pas lorsque la personne qui arrive en 2ème tente d'entrer. Est ce que quelqu'un aurait une petite idée concernant mon problème? Merci

  2. #2
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Salut,

    Lorsque tu initialises ton sémaphore, le fait de mettre l'argument pshared à '0' indique qu'il sera partagé entre thread. Or, si tu réalises un fork(), tu crées ici un processus, qui possède sa propre zone mémoire donc chacun possède son sémaphore, ce qui explique qu'il ne soit pas bloqué lors de l'appel de sem_wait. Il faut donc partager ce sémaphore entre processus à l'aide du zone mémoire partagée.

    man sem_init :
    http://man.developpez.com/man3/sem_init.3thr.php
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

Discussions similaires

  1. Petit problème de fork
    Par osmose22 dans le forum Linux
    Réponses: 7
    Dernier message: 18/03/2007, 21h10
  2. "Fork" en assembleur
    Par kamikazz dans le forum Assembleur
    Réponses: 6
    Dernier message: 05/10/2004, 13h36
  3. [langage] [Fork] Détecter un fichier
    Par GLDavid dans le forum Langage
    Réponses: 11
    Dernier message: 08/07/2004, 01h05
  4. Processus et sémaphores
    Par slim dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/05/2004, 22h27
  5. Pas de fork sous Windows?
    Par chezjm dans le forum POSIX
    Réponses: 8
    Dernier message: 11/06/2002, 12h15

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