Hello!
Dans mon programme C arive un moment ou je fais appel a un programme externe. Jusque là, je le faisais de cette manière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part system("cat input.txt | extprog o C > output.txt")
Comme vous pouvez le constater, ca génère deux fichier temporaires. J'aimerai à présent faire l'équivalent de cette commande en me passant de ces deux fichiers. Pour cela, j'ai utilisé une méthode basée sur les tubes, où je crée simplement deux tubes et je lance un processus fils pour pouvoir envoyer sur stdin et récupérer la sortie de stdout comme il se doit sans passer par des fichiers. En voici le code principal:
Du coté de l'entrée, ca semble fonctionner: le programme externe se lance correctement et recoit l'ensemble des données d'entrée, et l'on recoit ensuite la sortie en retour. Le problème, c'est que les données de sortie sont incomplètes: l'appel a write m'indique qu'il lit trés exactement 4096 caractères, puis plus rien... Et je sais qu'elle est incomplète car la sortie du programme esxterne génère parfois des fichiers de 2-3 MO...
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 int pr[2], pw[2] ; int flag ; char buf[1000], *inout = my_malloc(M_BUFSIZE*sizeof(char)) ; pid_t child ; flag = pipe(pr) ; if(flag == -1) return NULL ; flag = pipe(pw) ; if(!flag == -1) return NULL ; child = fork() ; if(child < 0) return NULL ; if(child == 0) { close(pw[1]) ; close(pr[0]) ; dup2(pw[0], STDIN_FILENO) ; close(pw[0]) ; dup2(pr[1], STDOUT_FILENO) ; close(pr[1]) ; execlp("qvoronoi", "qvoronoi", "p", "i", "Pp", "Fn", NULL) ; } else { close(pw[0]) ; close(pr[1]) ; sprintf(inout, "3 rbox D3\n%d\n", N) ; for(i = 0; i < N ; i++){ sprintf(buf, "%f %f %f \n", atom[N][M_X], atom[N][M_Y], atom[N][M_Z]) ; strcat(inout, buf) ; } write(pw[1], inout, strlen(inout)+1) ; close(pw[1]) ; flag = read(pr[0], inout, M_BUFSIZE) ; fprintf(stdout, "%d\n", flag) ; close(pr[0]) ; }
Et honnètement là je sèche je ne comprends pas pourquoi... Ya t-il une limite dans la lécture des données via un pipe? Si quelqu'un a une idée de l'origine du problème...
Merci d'avance!
Partager