H
Oder einfach popen/_popen/_wpopen verwenden. Geht noch einfacher und ist sogar fast plattformunabhängig. Ob das für dich sinnvoll ist, sei dahingestellt, es ist aber zweifelsohne kürzer.
#include <cstdio>
//...
static int closePipe(FILE *p)
{
#if _WIN32
return _pclose(p);
#else
return pclose(p);
#endif
};
//eine Klasse, deren Objekt eine Pipe enthält und diese automatisch mit closePipe schließt.
using pipeptr = std::unique_ptr<FILE, decltype(&closePipe)>;
//führt command aus und gibt dessen errorcode + rückgabewert zurück
std::pair<int, std::string> exec(const std::string &command)
{
#ifdef _WIN32
//2>&1 sorgt dafür, dass stderr nach stdout fließt
pipeptr pipe(_popen((command + " 2>&1").c_str(), L"r"), &closePipe);
#else
pipeptr pipe(popen((command + " 2>&1").c_str(), &closePipe);
#endif
if(!pipe)
...//fehler, den du aus errno auslesen kannst.
std::string output;
char buf[512];
while(fgets(buf, sizeof(buf), pipe.get()))
output += buf;
auto ret = closePipe(pipe.release());
return { ret, output };
}