URL: https://linuxfr.org/forums/programmation-c--2/posts/sort-injecte-des-donnees-binaires-apparemment Title: sort injecte des données binaires apparemment Authors: gunsailor Date: 2017年11月09日T18:18:35+01:00 License: CC By-SA Tags: Score: -1 Je suis en train de m'intéresser aux pipes chaînés en c. En voulant traiter un simple fichier texte, je me suis aperçu que des données binaires étaient injectées dans les données de retour de l'appel système "system" à l'appel de la fonction sort. voici le code de ma fonction de chaînage: int process_pipe_chained(char **commands, int nbr_commands, char *file, size_t content_size) { int tube[2]; char *content = strdup(file), c; int size = content_size; for(int i = 0; i < nbr_commands; i++) { if(process_pipe(commands[i], tube) != 0) { perror("invoque_processus"); exit(EXIT_FAILURE); } printf("-- Avant l'appel du module --\n%s--\n", content); write(tube[1], content, size); close(tube[1]); size = 0; free(content); content = malloc(128); while(read(tube[0], &c, 1) == 1) { char tmpchar[2]; tmpchar[0] = c; if(size> strlen(content) - 10) { content = realloc(content, strlen(content) + 128); size = strlen(content) + 128; } if(!size) strcpy(content, tmpchar); else strncat(content, tmpchar, 1); size++; } close(tube[0]); printf("-- Après l'appel du module --\n%s\n", content); } return 0; } et voici le code de ma fonction d'"entubage": int process_pipe (const char * commande, int fd[2]) { int tube_1[2]; int tube_2[2]; if ((pipe(tube_1) != 0) || (pipe(tube_2) != 0)) return -1; switch (fork()) { case -1 : close(tube_1[0]); close(tube_1[1]); close(tube_2[0]); close(tube_2[1]); return -1; case 0 : close(tube_1[1]); close(tube_2[0]); dup2(tube_1[0], STDIN_FILENO); dup2(tube_2[1], STDOUT_FILENO); system(commande); exit(EXIT_SUCCESS); default : close(tube_1[0]); close(tube_2[1]); fd[1] = tube_1[1]; fd[0] = tube_2[0]; } return 0; } Lorsque j'essaie par exemple d'extraire des lignes de texte grâce à "grep" puis de les trier avec "sort", ce dernier module ( mais pas grep ) introduit des données binaires dans son retour. J'ai donc au final une séquence d'extraits de texte triées mais comportant des données binaires rangés au début. On peut le vérifier en inversant l'appel des modules "grep" et "sort" car dans ce cas le programme me renvoie: Fichier binaire (entrée standard) correspondant Merci de votre attention