La Capture de la Sortie de a Engendré des Processus de la chaîne

De fond:


Je suis en train de travailler sur un programme qui doit être en mesure de saisir les stdout, stderr et les valeurs de retour d'un programme. Idéalement, je voudrais saisir ces dans une chaîne que je stocker à l'intérieur de mon objet qui contient les détails du processus. Actuellement j'ai un code qui fonctionne par enregistrer la sortie dans un fichier à l'aide de certains (à mon avis) archaïque C descripteur de fichier de la magie. De tout temps que je veux en sortie les résultats, j'ouvre ce fichier et je l'ai imprimer le contenu.

Parfois (quand je m'y frayer est gauche en cours d'exécution) de la prochaine exécution de mon exécutable se décomposer, car il est impossible d'ouvrir le fichier pour l'écriture.

Énoncé Du Problème:


Je suis à la recherche d'un moyen de sauver la sortie de stdout d'un processus créé dans windows pour une chaîne de caractères et la stderr à l'autre dans un endroit plus sûr, plus moderne de la mode. De cette façon, je pouvais imprimer le contenu de tout temps j'ai envie de sortir le résultat de chaque processus créé.

Mon laid code:


principal bloc-

    int stdoutold = _dup(_fileno(stdout)); //make a copy of stdout
    int stderrold = _dup(_fileno(stdout)); //make a copy of stderr
    FILE *f; 

    if(!fopen_s(&f, "name_of_my_file", "w")){ //make sure I can write to the file
        _dup2(_fileno(f), _fileno(stdout)); //make stdout point to f
        _dup2(_fileno(f), _fileno(stderr)); //make stderr point to f

        fork("command_I_want_to_run", &pi); //run my fake fork (see below)
    }
    else{
        ...//error handling
    }
    _close(_fileno(stdout)); //close tainted stdout
    _close(_fileno(stderr)); //close tainted stderr
    _close(_fileno(f)); //close f
    _dup2(stdoutold, _fileno(stdout)); //fix stdout
    _dup2(stderrold, _fileno(stderr)); //fix stderr

fourche- (vous pouvez considérer cela comme juste CreateProcess, mais juste au cas où quelqu'un a besoin de voir ce qui se passe ici)

int fork(std::string s, PROCESS_INFORMATION* pi){
char infoBuf[INFO_BUFFER_SIZE];
int bufCharCount = 
    ExpandEnvironmentStrings(s.c_str(), infoBuf, INFO_BUFFER_SIZE ); 
...
    STARTUPINFO si;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( pi, sizeof(*pi) );
    LPSTR str = const_cast<char *>(infoBuf);
    if(!CreateProcess(NULL,
        str,
        NULL,
        NULL,
        TRUE,
        0,
        NULL,
        NULL,
        &si,
        pi)
    ){
        int err = GetLastError();
        printf("CreateProcess failed (%d).\n", err);
        CloseHandle((*pi).hProcess);
        CloseHandle((*pi).hThread);
        return err;
    }
return 0;
}

Notes:


  • Je suis avec VS 2010
  • Je veux rester à l'aide de plusieurs processus, threads, car j'ai besoin de ce que j'ai exécuté pour avoir la liberté de ses propres processus

Edit:


Une note: j'ai aussi essayer d'attendre la fin du processus de droit après l'appel de la fonction qui exécute le code donné, si les résultats de stdout et stderr sont disponibles pour moi à l'époque.