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

Unix Discussion :

probleme avec le fontion fork()


Sujet :

Unix

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Points : 11
    Points
    11
    Par défaut probleme avec le fontion fork()
    Bonjour ,
    J'ai un code dont je ne comprends pas le fonctionnement

    l'exécution de celui ci donne:

    Fils voit 1
    Fils voit 2
    Fils voit 3
    Fils voit 99
    Le fils a terminé
    $
    Pourquoi le message « Fils voit 99 » s'affiche til ?

    j'espère que quelqu'un saura m'expliquer le fonctionement


    Code c : 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
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <errno.h>
     
    #define PERM_FILE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
     
    static int *getaddr(void) {
    key_t key;
    int shmid, *p;
    p=NULL;
    (void)close(open("shmseg", O_WRONLY | O_CREAT, 0));
    if ((key = ftok ("shmseg",1)) == 1)
    {
    printf("Échec de ftok\n");
    return(NULL);
    }
    if ((shmid=shmget(key,sizeof(int) ,IPC_CREAT | PERM_FILE))==1)
    {
    perror("Échec de ftok\n");
    return(NULL);
    }
    if ((p=shmat(shmid,NULL,0))==((vo id *)1))
    {
    perror("Échec de shmat");
    return(NULL);
    }
    return(p);
    }
     
    int main(void) {
    pid_t pid;
    if ((pid=fork()) == 0) {
    int *p,prev=0;
    if ((p=getaddr()) == NULL) {
    printf("Échec de getaddr\n");
    exit(EXIT_FAILURE);
    }
    while (*p != 99)
    if (prev != *p) {
    printf("Fils voit %d\n",*p);
    prev = *p;
    }
    printf("Le fils a terminé\n");
    } else {
    int *p;
    if ((p=getaddr()) == NULL) {
    printf("Échec de getaddr\n");
    exit(EXIT_FAILURE);
    }
    for (*p = 1; *p < 4; (*p)++)
    sleep(1);
    *p = 99;
    }
    exit(EXIT_SUCCESS);
    }

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par simovic Voir le message
    Pourquoi le message « Fils voit 99 » s'affiche til ?
    Parce que la valeur de *p a changé entre ton test while (*p != 99) et ton if (prev != *p), ou entre ton if (prev != *p) et ton printf. Il y a peut-être d'autres cas qui mène aussi à l'affichage du 99, mais tu vois l'idée : tu vois encore la vieille valeur (4) lors du teste, puis la valeur change, et tu vois la nouvelle valeur (99) quand tu l'affiche.

    Pour régler ces problèmes de synchronization, il faut utiliser un sémaphore qui protègera l'accès au segment de mémoire partagé.

Discussions similaires

  1. Probleme avec la fonction 'Fork'
    Par the_cha0s dans le forum C
    Réponses: 4
    Dernier message: 24/02/2012, 16h39
  2. un probleme avec fork()
    Par maestroENSI dans le forum C
    Réponses: 11
    Dernier message: 04/12/2010, 21h13
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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