Utilisez les fonction popen()/pclose()
Bonjour Sparky95,
C'est mieux d'utiliser les fonctions popen()/pclose() ici, car ces sont plus simples que les fonctions fork()/vfork() et plus utiles pour votre but.
Il faut que j'écrive les explications siffisantes, mais ce sera ma dette linguistique. J'ai simplement ajouté queque chose à votre code:
https://www.jeremymorgan.com/tutoria...-command-in-c/
https://stackoverflow.com/questions/...ecuted-to-cout
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
//main.cpp
#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <array>
class redirecter
{
public:
redirecter(std::ostream & dst, std::ostream & src)
: src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
~redirecter() { src.rdbuf(sbuf); }
private:
std::ostream & src;
std::streambuf * const sbuf;
};
int main()
{
std::ofstream log("hello-world.log");
redirecter redirect(log, std::clog);
std::clog << "Main started" << std::endl;
std::string command("./test1");
command.append(" 2>&1");
std::array<char, 128> buffer;
std::string result;
std::clog << "Opening reading pipe" << std::endl;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe)
{
std::cerr << "Couldn't start command." << std::endl;
return 0;
}
while (fgets(buffer.data(), 128, pipe) != NULL)
{
std::clog << "Reading..." << std::endl;
result += buffer.data();
}
auto returnCode = pclose(pipe);
std::clog << "result = " << result << std::endl;
std::clog << "resultCode = " << returnCode << std::endl;
std::clog << "Main is exiting" << std::endl;
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11
|
//test1.cpp
#include <iostream>
int main()
{
std::clog << "C'est Test1" << std::endl;
return 0;
} |
Code:
1 2 3
|
g++ -o test1 test1.cpp
g++ -o main main.cpp -std=c++11 |