• # .

    Posté par . En réponse au message popen / pclose. Évalué à 5.

    Pour le moment j'ai trouvé une solution avec popen+close qui me permet de recuperer le code de retour, en revanche, pour stderr et stdout, je ne vois pas comment les recuperer separement.

    Je viens d'écrire rapidement (comprendre pas très propre) un code sur lequel tu peux te baser, si tu as des questions n'hésite pas !


    #include <iostream>
    #include <string>

    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>

    #define STDOUT 1
    #define STDERR 2

    using namespace std;

    void WPipe(int Fd[2])
    {
    if (pipe(Fd) < 0)
    {
    perror("Erreur pipe");
    exit(EXIT_FAILURE);
    }
    return;
    }

    void WDup(int oldfd, int newfd)
    {
    if (dup2(oldfd, newfd) < 0)
    {
    perror("Erreur dup2");
    exit(EXIT_FAILURE);
    }
    }

    int main()
    {
    int status;
    int FdCOut[2];
    int FdCErr[2];
    pid_t Pid;

    WPipe(FdCErr);
    WPipe(FdCOut);
    Pid = fork();

    if (Pid == -1)
    {
    perror("Erreur fork");
    exit(EXIT_FAILURE);
    }
    else if (Pid == 0) // Child
    {
    close(FdCOut[0]);
    close(FdCErr[0]);
    WDup(FdCOut[1], STDOUT);
    WDup(FdCErr[1], STDERR);

    execl("./test.run", "a", (char *) NULL);

    perror("Erreur execl");
    exit(EXIT_FAILURE);
    }

    close(FdCOut[1]);
    close(FdCErr[1]);

    // Ici mettre la lecture depuis FdCOut[0] et FdCErr[0]
    char tmp[1024];
    string output = "";
    while (read(FdCOut[0], tmp, 1024) > 0)
    {
    output.append(tmp);
    }
    std::cout << output << endl;

    waitpid(Pid, &status, 0);

    if (!WIFEXITED(status))
    {
    std::cerr << "Erreur fils\n";
    exit(EXIT_FAILURE);
    }

    cout << "OK, code sortie: "
    << WEXITSTATUS(status)
    << "\n";

    return 0;
    }