#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/wait.h>#include<sys/select.h>#include<sys/time.h>#include<sys/types.h>#include<errno.h>#include<string.h>#define BUFF_SIZE 4096 /* the capacity of a pipe is 4096 bytes */#define NB_PIPE 2intmain(intargc,char**argv){charbuff[BUFF_SIZE];/* Déclaration des variables */char*basharg[3];intfd[NB_PIPE][2];FILE*f=NULL;fd_setreadfds;structtimevaltimeout;intpid,i,nb_read;memset(buff,0,sizeofbuff);f=fopen("tmp_log","wba+");for(i=0;i<NB_PIPE;i++){/* Création des pipes */if(pipe(fd[i])==-1){perror("pipe failed\n");return1;}}if((pid=fork())==-1){/* Création du processus fils */perror("fork failed\n");return2;}if(pid==0){/* Processus fils */close(fd[0][1]);/* Ferme l'entrée de pipe 1 */close(fd[1][0]);/* Ferme la sortie de pipe 2 */dup2(fd[0][0],0);/* Duplique la sortie de pipe 1 sur STDIN */dup2(fd[1][1],1);/* Duplique l'entrée de pipe 2 sur STDOUT */basharg[0]="/bin/bash";basharg[1]="-li";basharg[2]=NULL;execve("/bin/bash",basharg,NULL);perror("Execve failed\n");exit(EXIT_FAILURE);}else{/* Processus père */close(fd[0][0]);/* Ferme la sortie de pipe 1 */close(fd[1][1]);/* Ferme l'entrée de pipe 2 */while(waitpid(pid,NULL,WNOHANG)!=pid){timeout.tv_sec=5;/* Initialisation timeout et des file descriptor a écouter */timeout.tv_usec=0;FD_ZERO(&readfds);FD_SET(STDIN_FILENO,&readfds);FD_SET(fd[1][0],&readfds);select(FD_SETSIZE,&readfds,NULL,NULL,&timeout);/* On ecoute les descripteurs de fichier contenu dans readfds *//* Activité detectée */if(FD_ISSET(STDIN_FILENO,&readfds)){/* Sur STDIN */nb_read=read(STDIN_FILENO,buff,BUFF_SIZE);/* Lecture sur STDIN* */write(fd[0][1],buff,nb_read);/* Ecriture sur l'entrée de pipe 1 */fseek(f,0,SEEK_END);/* Se déplace a la fin du fichier */for(i=0;i<nb_read;i++){fputc(buff[i],f);/* Ecrit un caractère a la fin du fichier */}}if(FD_ISSET(fd[1][0],&readfds)){/* Sur la sortie du pipe 2 */nb_read=read(fd[1][0],buff,BUFF_SIZE);/* Lecture sur la sortie de pipe 2 */write(STDOUT_FILENO,buff,nb_read);/* Ecriture sur STDOUT*/fseek(f,0,SEEK_END);/* Se déplace a la fin du fichier */for(i=0;i<nb_read;i++){fputc(buff[i],f);/* Ecrit un caractère a la fin du fichier */}}}}return0;}
[^] # Re: Impossible
Posté par Totoro . En réponse au message Communication entre processus avec pipe() et dup2().. Évalué à 1.
Pour execve si j'utilise :
Le prompt ne s'affiche pas.
Je pense avoir corrigé le reste .