Comment lire les résultats de l'appel system() en C++?

J'utilise le code suivant pour essayer de lire les résultats d'une df de commande sous Linux à l'aide de popen.

#include <iostream> //file and std I/O functions

int main(int argc, char** argv) {
    FILE* fp;
    char * buffer;
    long bufSize;
    size_t ret_code;

    fp = popen("df", "r");
    if(fp == NULL) { //head off errors reading the results
        std::cerr << "Could not execute command: df" << std::endl;
        exit(1);
    }

    //get the size of the results
    fseek(fp, 0, SEEK_END);
    bufSize = ftell(fp);
    rewind(fp);

    //allocate the memory to contain the results
    buffer = (char*)malloc( sizeof(char) * bufSize );
    if(buffer == NULL) {
        std::cerr << "Memory error." << std::endl;
        exit(2);
    }

    //read the results into the buffer
    ret_code = fread(buffer, 1, sizeof(buffer), fp);
    if(ret_code != bufSize) {
        std::cerr << "Error reading output." << std::endl;
        exit(3);
    }

    //print the results
    std::cout << buffer << std::endl;

    //clean up
    pclose(fp);
    free(buffer);
    return (EXIT_SUCCESS);
}

Ce code me donne une "erreur de Mémoire" avec un statut de sortie de '2', afin que je puisse voir il ne fonctionne pas, je ne comprends pas pourquoi.

J'ai mis cet ensemble à partir de l'exemple de code que j'ai trouvé sur Ubuntu Forums et Référence C++ , donc je ne suis pas marié avec elle. Si quelqu'un peut proposer une meilleure façon de lire les résultats d'un appel system (), je suis ouvert à de nouvelles idées.

MODIFIER à l'original: Bon, bufSize est à venir négatif, et maintenant je comprends pourquoi. Vous ne pouvez pas accéder de manière aléatoire à un tuyau, comme je l'ai naïvement tenté de le faire.

Je ne peux pas être la première personne à essayer de le faire. Quelqu'un peut-il donner (ou m'indiquer un exemple de comment lire les résultats de l'appel system() dans une variable en C++?

  • 'Appel système" a un sens très précis - voir <en.wikipedia.org/wiki/System_call>. Ce que vous essayez de faire, pour récupérer la sortie d'un autre programme (je ne suis pas sûr de ce que le terme technique pour cela est hors de ma tête).
  • Merci. J'ai édité la question pour essayer de clarifier.