Communication bidirectionnelle entre parent et enfant

J’essaie de créer une communication bidirectionnelle entre les processus parent et enfant à l’aide de 2 canaux dans C.le prog1 en cours d’exécution dans enfant1. Je veux lire 3 + 4 + 5 à partir de prog1 après l’envoi de quelque chose à prog1 avec write mais je ne pouvais pas. Où est le mal?

/* prog1.c */ #include  #include  #include  void main(void){ int FD; unsigned int buf; char buf[15]; printf("7+5+11=?\n"); FD=read(0,buf,10); if(FD<0){ perror("FAIL\n"); exit(EXIT_FAILURE); } printf("TAKED:%s\n",buf); } 

prog2.c

 #include  #include  #include  #include  #include  void ERR_SYS(const char *msg); int main(void){ char buf[15]; int pipe1[2]; int pipe2[2]; pid_t childpid; memset(buf,'\0',14); if(pipe(pipe1) < 0 || pipe(pipe2) < 0) ERR_SYS("fail_pipe"); if((childpid = fork()) < 0) ERR_SYS("fail_fork"); if(childpid==0) { dup2(pipe2[1],1); dup2(pipe1[0],0); close(pipe1[1]); close(pipe2[0]); close(pipe2[1]); close(pipe1[0]); //close(1); //close(0); execle("./prog1",NULL,NULL,NULL); }else{ close(pipe1[0]); close(pipe2[1]); read(pipe2[0],buf,4); /*I hope to read 3+4+5*/ printf("BuF::%s\n",buf); write(pipe1[1],"off",3);/*send {off}*/ wait(NULL); } return 0; } void ERR_SYS(const char *msg) { perror(msg); exit(EXIT_FAILURE); } 

Il y a peu de problèmes avec votre programme:

  1. Vous ne vérifiez pas les valeurs renvoyées de read, write et execle dans prog2.c
  2. Vous envoyez une chaîne “7 + 5 + 11 =? \ N” d’une longueur de 10 caractères mais n’attendant que 4 caractères (3 + 4 + 5 ne représente même pas quatre caractères).
  3. Aussi, “off” que vous envoyez est long de 3 caractères mais sans la terminaison nulle.
  4. Lorsque vous lisez à partir d’un fd vous n’obtiendrez dans les deux cas pas de chaîne terminée par un caractère null, puis vous essayez de l’ printf . C’est un moyen rapide d’avoir un comportement indéfini. Mettez un ‘\ 0’ après la fin du tampon lu depuis n’importe quel descripteur de fichier!
  5. Ce qui est read est particulièrement important car il indique le nombre de caractères lus. Vous ne devriez jamais ignorer la valeur renvoyée de read (dans certains cas, c’est la même chose avec la fonction write ).

La prochaine fois, fournissez également des résultats de votre programme, car il vous sera plus facile de les aider.

Je n’ai pas suivi toute votre logique dans la mise en place des tuyaux, alors j’ai modifié et j’espère clarifié votre original. Je dois noter que, pour une raison quelconque, j’ai nommé fd_in et fd_out du sharepoint vue du programme externe (prog1) (par exemple, fd_out est l’endroit où prog1 écrit, fd_in est l’endroit où prog1 lit).

Voici le contenu de mon prog3.c:

 ... #define READ_END 0 #define WRITE_END 1 void ERR_SYS(const char *msg); int main(void) { char buff[15]; char *msg = "hello"; int fd_out[2]; int fd_in[2]; int nbytes; pid_t childpid; if(pipe(fd_out) < 0 || pipe(fd_in) < 0) { ERR_SYS("fail_pipe"); } if((childpid = fork()) < 0) { ERR_SYS("fail_fork"); } if(childpid==0) { //child //connect the write end of fd_out to stdout dup2(fd_out[WRITE_END], STDOUT_FILENO); close(fd_out[WRITE_END]); //connect the read end of fd_in to stdin dup2(fd_in[READ_END], STDIN_FILENO); close(fd_in[READ_END]); //the exec'd prog1 will inherit the streams execlp("./prog1", "prog1", NULL); //TODO: check return } else { //parent nbytes = write(fd_in[WRITE_END], msg, strlen(msg)); //TODO: handle any errors from write nbytes = read(fd_out[READ_END],buff,sizeof(buff)-1); //TODO: handle any errors from read buff[nbytes] = '\0'; printf("contents of buff::%s",buff); } return 0; } void ERR_SYS(const char *msg) { perror(msg); exit(EXIT_FAILURE); } 

Et voici le contenu de mon prog1.c

 int main(void){ char buff[15]; int nbytes; nbytes = read(STDIN_FILENO, buff, sizeof(buff)-1); buff[nbytes] = '\0'; printf("%s world\n", buff); return 0; 

}