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 :

Un problème de.. segmentation?


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Un problème de.. segmentation?
    Bonjour, j'ai un problème avec un code aujourd'hui qui agit d'une façon que je ne prévoyais pas du tout.
    Aperçu du code:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
     
    [...]
     
    int	main(int ac, char **av, char **env)
    {
      int	i;
      pid_t	opid;
      int	*com;
     
      com = malloc(sizeof(int));
      if (com == NULL)
        {
          printf("Allocation failure\n");
          _exit(1);
        }
      *com = 0;
      opid = getpid();
      i = 0;
      while (env[i])
        printf("%s\n", env[i++]);
      printf("Will now divide into two processes\n");
      fork();
      if(getpid() == opid)
        {
          printf("I am the father %d %d, and I wait for my son to give signal\n", getpid(), getppid());
          while (*com == 0);
         printf("Son is alive, resume\n");
          wait();
          printf("Son's status is down, continue with normal father execution\n");
        }
      else
        {
          *com = 666;
          subroutine(env);
        }
        free(com);
        return (0);
    }
    Mon problème vient du fait que l'adresse stockée par com ne pointe pas vers la même valeur dans les deux programmes, bien que les adresses de com dans les deux programmes soient les mêmes. Je ne comprend pas: ligne 20 j'initialise la valeur pointée par com à zéro, ligne 30 je continue tant que cette valeur reste inchangée (c'est à dire tout le temps) alors que ligne 37, j'ai bien modifié la valeur pointée par com...
    En gros si je fais un printf("%d %p\n", *com, com) dans le père j'aurais "0 0x33bec3" et dans le fils j'aurais: "666 0x33bec3". Si les deux valeurs sont stockées au même endroit, pourquoi ne sont elles pas équivalentes? Comment assurer un flux de données entre les deux programmes?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonsoir,

    Citation Envoyé par kruller Voir le message
    Bonjour, j'ai un problème avec un code aujourd'hui qui agit d'une façon que je ne prévoyais pas du tout.
    Aperçu du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    On suppose donc que tu travailles sous UNIX.

    Mon problème vient du fait que l'adresse stockée par com ne pointe pas vers la même valeur dans les deux programmes, bien que les adresses de com dans les deux programmes soient les mêmes. Je ne comprend pas: ligne 20 j'initialise la valeur pointée par com à zéro, ligne 30 je continue tant que cette valeur reste inchangée (c'est à dire tout le temps) alors que ligne 37, j'ai bien modifié la valeur pointée par com...
    En gros si je fais un printf("%d %p\n", *com, com) dans le père j'aurais "0 0x33bec3" et dans le fils j'aurais: "666 0x33bec3". Si les deux valeurs sont stockées au même endroit, pourquoi ne sont elles pas équivalentes?
    D'abord parce que tu travailles sur un système multi-tâches, en mode protégé ou équivalent. Ceci signifie qu'il est a priori interdit à un processus d'écrire dans l'espace mémoire d'un autre (en fait, en dehors de l'espace qui lui a été alloué). Ce contrôle est fait directement par le micro-processeur, qui déclenche une exception le cas échéant, au lieu d'exécuter l'instruction incriminée. Lire ou écrire dans un segment de mémoire non autorisé est une « Segmentation Violation » ou « Segmentation Fault ».

    Ensuite, il y a de fortes chances que la machine que tu utilises remappe l'adressage d'un processus, de sorte que chacun d'eux a l'impression d'être localisé à une même adresse alors qu'en fait, celle-ci correspond à un emplacement différent. Donc, même si tu avais le droit de le faire, une adresse mémoire dans un pointeur ne pointerait pas le même endroit vu des deux processus.

    Comment assurer un flux de données entre les deux programmes?
    Certainement pas de cette façon en tout cas. :-)

    Les procédés de communications entre processus sous UNIX s'appellent IPC (Inter-Process Communications). Formellement, on y inclut les pipes, les sockets, et les IPC SysV qui proposent des files de messages, des sémaphores, et des segments de mémoire partagée. Ce sont ceux-ci qu'il faut utiliser.

    On y compte aussi les « signaux » mais seulement parce que c'est effectivement un moyen pour un processus d'avoir de l'influence sur un autre. Il ne faut surtout pas les utiliser pour échanger des données.

    Un segment de mémoire partagée peut être hérité d'un processus par un autre. Mais il est aussi affublé d'un identifiant visible du système entier et s'il n'est pas déclaré PRIVATE, n'importe quel processus peut demander à s'y rattacher pour en lire ou en modifier le contenu lui-aussi.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci c'est exactement la réponse que j'attendais. Effectivement j'ai oublié de préciser que c'était sous linux/unix, merci de me l'avoir fait remarqué

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    On y compte aussi les « signaux » mais seulement parce que c'est effectivement un moyen pour un processus d'avoir de l'influence sur un autre. Il ne faut surtout pas les utiliser pour échanger des données.
    Je me suis amusé une fois à programmer un échange de données à base de signaux utilisés comme le morse. SIGUSR1 pour point et SIGUSR2 pour trait. Bien entendu aucun intérêt concret autre que de se faire plaisir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/11/2007, 18h44
  2. Problème java segmentation
    Par irdaa dans le forum Mandriva / Mageia
    Réponses: 1
    Dernier message: 28/03/2007, 08h24
  3. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50
  4. Problème de segmentation.
    Par Gryzzly dans le forum C
    Réponses: 12
    Dernier message: 27/12/2005, 11h02
  5. Problème de segmentation ?
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 23/12/2004, 18h33

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