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

POSIX C Discussion :

Communication par tubes, passage d'une chaine de caractères.


Sujet :

POSIX C

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Communication par tubes, passage d'une chaine de caractères.
    Bonjour,
    Je me permet de poster car je suis déconcerté par le rendu du 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
    59
    60
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/errno.h>
    #include <stdio.h>
    #include <limits.h>
    #include <stdlib.h>
    #include <string.h>
    extern int errno;
     
    int main(){
    	int child = fork();
    	int p_desc[2];
    	int err = pipe(p_desc);
    	if(child > 0){
    		printf("Processus PERE pid: %d ppid: %d pid_fils: %d \n", getpid(), getppid(), child);
    		int status;
    		close(p_desc[0]);
     
    		char * msg = malloc(strlen("Je suis ton pere."));
    		msg = "Je suis ton pere.";
     
    		err = write(p_desc[1],msg,strlen(msg));
    		if(err == -1){
    			printf("Error: %s\n", strerror(errno));
    			exit(EXIT_FAILURE);
    		}
     
    		printf("test1 \n");
     
    		wait(&status);
    		free(msg);
     
    		if(WIFEXITED(status)) printf("Mon fils %d s'est correctement terminé.\n", child);
    		else if(WIFSIGNALED(status)){
    			printf("Mon fils s'est terminé à cause du signal %d.\n", WTERMSIG(status));
    		}
     
    		printf("test2 \n");
    	}
    	else if(child == 0){
    		printf("Processus FILS pid: %d ppid: %d\n", getpid(), getppid());
    		close(p_desc[1]);
     
    		char * buf = malloc(_POSIX_PIPE_BUF*sizeof(char));
    		err = read(p_desc[0],buf, strlen(buf)); 
    		if(err == -1){
    			printf("Error: %s \n", strerror(errno));
    			exit(EXIT_FAILURE);
    		}
    		printf("Mon pere m'a dit: %s\n", buf);
    		free(buf);
    		exit(EXIT_SUCCESS);
    	}
    	else{
    		perror("Erreur de creation de processus fils !\n");
    		 printf("Error: %s\n", strerror(errno));
    	}
    	return 0;
    }
    Voici le rendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./tubes 
    Processus PERE pid: 2359 ppid: 2104 pid_fils: 2360 
    Processus FILS pid: 2360 ppid: 2359
    Mon pere m'a dit:
    Comme vous pouvez le voir, le fils n'affiche pas la chaine de caractère passée par le pipe. De plus les messages de test des lignes 29 et 39 ne sont pas visibles.
    Aurai-je mal utilisé le pipe ou est-ce un problème lié à autre chose ?

    Je vous remercie d'avance pour vos réponses.

    Ben

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * msg = malloc(strlen("Je suis ton pere."));
    msg = "Je suis ton pere.";


    Tu alloues de la mémoire dynamique pour stoker la chaine de caractères, en oubliant d'ajouter 1 (il ne faut pas oublier le '\0')... puis tu écrases la valeur du pointeur par une chaine statique au lieu de copier la fameuse chaine à l'adresse pointée. Fuite de mémoire.

    Pour le reste du code, je ne pourrai pas t'être très utile. Je ne suis pas très calé dans la programmation Linux.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Toutes mes excuses, problème résolu.
    J'avais déclaré le pipe après avoir forké, de plus j'avais spécifié une taille inexacte aux fonctions read et write.

    Oui jeroman, il y avait ça aussi, merci !

    Bonne soirée.

    Ben

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Puisque tu es sous POSIX, autant utiliser strdup().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [MySQL] Passage d'une chaine de caractère à une requête via une fonction
    Par jalam dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/09/2009, 17h58
  2. Réponses: 5
    Dernier message: 28/06/2007, 09h41
  3. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  4. Réponses: 3
    Dernier message: 26/07/2006, 14h58
  5. Réponses: 4
    Dernier message: 26/12/2005, 17h01

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