• [^] # Re: Impossible

    Posté par . En réponse au message Communication entre processus avec pipe() et dup2().. Évalué à 1.

    Pour execve si j'utilise :

    basharg[0] = "-i";
    basharg[1] = NULL;
    

    Le prompt ne s'affiche pas.

    Je pense avoir corrigé le reste .

    #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 2
    int main(int argc, char **argv){
     char buff[BUFF_SIZE]; /* Déclaration des variables */
     char* basharg[3];
     int fd[NB_PIPE][2];
     FILE *f = NULL;
     fd_set readfds;
     struct timeval timeout;
     int pid,i,nb_read;
     memset(buff,0,sizeof buff);
     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");
     return 1;
     }
     }
     if((pid = fork()) == -1){ /* Création du processus fils */
     perror("fork failed\n");
     return 2;
     }
     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 */
     }
     }
     }
     }
     return 0;
    }