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 }; }