[C/UNIX] Tube + Mémoire partagée

Tube + Mémoire partagée [C/UNIX] - C - Programmation

Marsh Posté le 26-12-2005 à 11:57:55    

Salut à tous et Joyeux Nöel !
 
J'ai un petit problème dans mon code, voici tout d'abord le code, j'expliquerai mon problème dans la suite :
 
Programme "principal":

Code :
  1. int main (int argc, char *argv[]) {
  2. void afficheur(*int)
  3. /*Déclaration de Variables */
  4. int shmid,tube[2];
  5. int *valeurs;
  6. /* Allocation des segments de mémoire partagée */
  7. shmid = shmget(IPC_PRIVATE, sizeof(int)*4, 0666);
  8. valeurs = (int *)shmat(shmid, NULL, 0);
  9. /* Création d'un tube */
  10. if (pipe (tube) == -1)
  11.     {
  12.       perror ("creation pipe impossible\n" );
  13.       exit(1);
  14.     }
  15. afficheur(tube);
  16. close(tube[0]);
  17. write(tube[1],valeurs,sizeof(int)*4);
  18. }


 
Fonction afficheur :

Code :
  1. void afficheur(int *tube)
  2. {
  3.   int *val;
  4.   if(! fork())
  5.     {
  6.   close(tube[1]);
  7.   read(tube[0],val,sizeof(int)*4);
  8.   printf("Valeur : %d",val[0]);
  9.     }
  10. }


 
Donc comme vous pouvez le constater j'ai crée quatre segments de mémoire partagée avec des valeurs qui seront changées par des processus mais là n'est pas le problème, tout cette partie fonctionne ... j'ai juste un problème avec mon tube pour afficher les valeurs si quelqu'un pouvait m'expliquer où j'ai fait l'erreur parce que mon programme ne m'affiche pas les valeurs attendues !
 
Merci beaucoup pour votre aide !


Message édité par arnaudm57 le 26-12-2005 à 20:08:09
Reply

Marsh Posté le 26-12-2005 à 11:57:55   

Reply

Marsh Posté le 26-12-2005 à 15:13:23    

val n'est pas alloué dans la fonction afficheur


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 26-12-2005 à 16:19:52    

Après la lecture dans le tube, la valeur "val" est censé être affectée non ?

Reply

Marsh Posté le 26-12-2005 à 19:42:29    

arnaudm57 a écrit :

Après la lecture dans le tube, la valeur "val" est censé être affectée non ?


Par quel miracle ?

Code :
  1. {
  2.   int *val;
  3.   <...>  
  4.   read(tube[0],val,sizeof(int)*4);


'val' est un pointeur non initialisé. Tu passes une valeur indéterminée à une fonction, le comportement est indéterminé. Tu veux probablement

Code :
  1. int val[4];
  2.   <...>  
  3.   read(tube[0],val,sizeof val);


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed