Se connecter / S'enregistrer

Résolu [C/C++][linux/unix] Un problème de segmentation...

Solutions (3)
Tags :
  • unix
  • linux
  • Programmation
, OS (collector) |
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:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5.  
  6. [...]
  7.  
  8. int main(int ac, char **av, char **env)
  9. {
  10. int i;
  11. pid_t opid;
  12. int *com;
  13.  
  14. com = malloc(sizeof(int));
  15. if (com == NULL)
  16. {
  17. printf("Allocation failure\n");
  18. _exit(1);
  19. }
  20. *com = 0;
  21. opid = getpid();
  22. i = 0;
  23. while (env[i])
  24. printf("%s\n", env[i++]);
  25. printf("Will now divide into two processes\n");
  26. fork();
  27. if(getpid() == opid)
  28. {
  29. printf("I am the father %d %d, and I wait for my son to give signal\n", getpid(), getppid());
  30. while (*com == 0);
  31. printf("Son is alive, resume\n");
  32. wait();
  33. printf("Son's status is down, continue with normal father execution\n");
  34. }
  35. else
  36. {
  37. *com = 666;
  38. subroutine(env);
  39. }
  40. free(com);
  41. return (0);
  42. }

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?
Contenus similaires
Meilleure solution
partage
|
Effectivement, je confirme ce que dit sIake, 2 processus sont indépendants, ils ne partagent pas du tout la même memoire (alors que les threads sont dans le même processus et partage donc la même mémoire, d'où une synchronisation par mutex et semaphore).

En ce qui concerne les adresses mémoire, c'est parce que ces adresses ne sont pas des valeurs absolues de la mémoire RAM (ce ne sont pas des adresses physiques), mais ce sont des adresses virtuelles qui, en pratique, n'ont pas forcément un adressage linéaire, et sont indexées par rapport au processus.
Comme tes 2 processus sont quasi-identiques, il est normal que la structure de la mémoire soit la même. Donc, dans les 2 processus, les valeurs des adresses virtuelles peuvent être les mêmes, mais pointent sur des adresses physiques différentes. Ceci permet, entre autres, de s'assurer qu'un processus n'écrit pas sur un autre. :) 

Bref, si tu veux rester sur des processus distincts, il te faut utiliser des mécanismes de communication inter-processus (IPC). Par exemple tu peux utiliser les Pipes, une Shared Memory, des signaux et autres (selon l'OS sur lequel tu travailles).
  • Commenter cette solution |
Score
0
òh
òi
, OS (collector) |
CRicky a dit :
Effectivement, je confirme ce que dit sIake, 2 processus sont indépendants, ils ne partagent pas du tout la même memoire (alors que les threads sont dans le même processus et partage donc la même mémoire, d'où une synchronisation par mutex et semaphore).
n
nEn ce qui concerne les adresses mémoire, c'est parce que ces adresses ne sont pas des valeurs absolues de la mémoire RAM (ce ne sont pas des adresses physiques), mais ce sont des adresses virtuelles qui, en pratique, n'ont pas forcément un adressage linéaire, et sont indexées par rapport au processus.
nComme tes 2 processus sont quasi-identiques, il est normal que la structure de la mémoire soit la même. Donc, dans les 2 processus, les valeurs des adresses virtuelles peuvent être les mêmes, mais pointent sur des adresses physiques différentes. Ceci permet, entre autres, de s'assurer qu'un processus n'écrit pas sur un autre. :) 
n
nBref, si tu veux rester sur des processus distincts, il te faut utiliser des mécanismes de communication inter-processus (IPC). Par exemple tu peux utiliser les Pipes, une Shared Memory, des signaux et autres (selon l'OS sur lequel tu travailles).

n
nMerci beaucoup ma théorie sur la correspondance programme/matériel est brisée et plus jamais je ne ferais confiance à des pointeurs :'( 
nNan sérieux merci c'était clair.
nMeilleure réponse sélectionnée par Archange_nain.
  • Commenter cette réponse |
Score
0
òh
òi
|
Lorsque tu forks, tu as deux processus, pére et fils, bien distincts qui n'ont pas le même pid.
L'un s'execute et pendant ce temps l'autre est mis en attente. Donc, comme tu as pu as pu le remarquer, les variables ne sont pas accessibles par les deux process (il faut utiliser les threads et les mutex pour ca).
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS