• [^] # Re: revoir l'enoncé et choisir ce qui va bien

    Posté par . En réponse au message Communication entre deux processus pere-fils bloquante. Évalué à 1.

    J'ai remplacé mon code pere.cpp :

     char buf [10];
     FILE *pp;
     pp = popen("/home/jo-pc/Bureau/STAGE/Projet_spectro/pipe/test_3/fils", "r");
     if (pp == NULL)
     {
     perror("popen");
     exit(1);
     }
     printf("etape1");
     while (fgets(buf, sizeof(buf), pp))
     fputs(buf, stdout);
     pclose(pp);
     printf("etape2");
     printf("%s",buf);
    

    Ainsi, j'ai :
    etape1coucou
    etape2coucou

    Je pense donc que c'est correcte. popen créé un pipe entre les deux fichiers et lit sur l'entrée standard du process fils.

    Autre méthode qui marche pour le pere.cpp via ce lien en utilisant les E/S standard : Texte du lien

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    //#define BUFSIZ 20
    int main()
    {
     /* create the pipe */
     int fds[2];
     if (pipe(fds) == -1)
     {
     printf("pipe failed\n");
     return 1;
     }
     /* create the child */
     int pid;
     if ((pid = fork()) < 0)
     {
     printf("fork failed\n");
     return 2;
     }
     if (pid == 0)
     {
     /* child */
     //char buffer[20];
     close(fds[0]);
     dup2(fds[1], STDOUT_FILENO);
     execl("/home/jo-pc/Bureau/STAGE/Projet_spectro/Projet_spectro_1/Test/Acquisition","Acquisition",NULL);
     close(fds[1]);
     }
     else
     {
     /* parent */
     waitpid(pid,NULL,0);
     char buffer[1000];
     close(fds[1]);
     dup2(fds[0], STDIN_FILENO);
     while (read(fds[0], buffer, 1000) != 0)
     printf("%s\n", buffer);
     close(fds[0]);
     //printf("%s", buffer); printf("%s", buffer); printf("%s", buffer);
     std::cout << buffer << std::endl;
     }
     return 0;
    }
    

    Ca fonctionne bien pour le moment. Je vais continuer d'exploiter ceci. Je fairais un retour. Merci beaucoup