Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Besoin de précision sur la fonction popen

11 Jul modifié dans Qt / Langage C++
Bonsoir a tous,

J'ai comme projet depuis quelque temps de réaliser un petit programme permettant de voir le hardware de son pc (cpu,gpu,ram,etc..)
Dans mes recherches j'ai trouvé une fonction : popen, qui semble intéressante.
J'ai fais quelques recherches sur son fonctionnement mais je n'ai pas réellement compris comment elle fonctionne,d'après ce que j'ai lu elle créerait un "pipe"..
Je me suis juste contenté de l'utiliser pour extraire les infos dont j'avais besoin.

J'espère que vous pouvez m'en dire plus sur cette fonction ^^
Merci

JPG
JPG
fonctionPopen.JPG
41K
JPG
JPG
ProtoCPUbeavers.JPG
29K

Réponses

  • Pipe (tube en français) est un concept unix qui permet de faire de la redirection de flux.

    As-tu regardé la classe QProcess ?
    Ca doit être plus simple à utiliser que popen.
  • Merci pour votre reponse.
    Je ne me suis pas interessé a la classe QProcess,mais j'ai pas mal cherché de solution pour extraire les infos du hardware..

    La fonction popen me paraissait pas mal avec les commandes wmic,mais du coup au niveau de la syntaxe,ça reste plutôt abstrait pour moi ^^ (voir photo).Je me suis vraiment contenté de l'utiliser sans vraiment la comprendre,mais maintenant j'aimerais bien la comprendre image
    JPG
    JPG
    fonctionPopen.JPG
    41K
  • Pour les pipes, tu trouveras plein de tutos sur internet.
    La redirection de flux c'est surtout utilisé dans les scripts shell.

    Maintenant c'est pas du Qt, même pas du C++, mais du C et pas vraiment multi plateformes.
    En fait popen c'est sympa car simple à utiliser, mais c'est du bon vieux C donc c'est facile de faire n'importe quoi ;)

    Un exemple, mais uniquement pour osx:
    #include <stdio.h>

    #define MaxBuf 80

    static QString openPipe(const char* cmd)
    {
    char buf[MaxBuf];
    QString txt;

    FILE* pipe=popen(cmd,"r");

    if(pipe)
    {
    while(fgets(buf,MaxBuf, pipe))
    txt.append(buf);

    pclose(pipe);
    }
    else
    {
    perror("erreur");
    }

    return txt;
    }

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);

    QTextEdit ed;
    ed.setCurrentFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
    // sysctl existe sur linux/unix
    ed.append(openPipe("sysctl -n machdep.cpu.brand_string"));
    ed.append(openPipe("sysctl -n kern.version"));
    //ed.append(openPipe("sysctl -A")); // liste toutes les variables dispo

    // uniquement pour osx
    ed.append(openPipe("sw_vers"));
    ed.append(openPipe("system_profiler SPEthernetDataType"));
    ed.append(openPipe("system_profiler SPDisplaysDataType"));

    ed.resize(600,400);
    ed.show();

    return app.exec();
    }

    ProductName: Mac OS X
    ProductVersion: 10.9.5
    BuildVersion: 13F1134

    Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz

    Ethernet Cards:

    Realtek RTL8168G/8111G PCI Express Gigabit Ethernet:

    Graphics/Displays:

    Intel HD Graphics 4600:

    Displays:

    PHL 234E5:
    Resolution: 1920 x 1080 @ 60Hz (1080p)
    Pixel Depth: 32-Bit Color (ARGB8888)
    Main Display: Yes
    Mirror: Off
    Online: Yes
    Rotation: Supported
  • Merci de votre reponse.

    Mais du coup vaut mieux que j'utilise autre chose que popen..
    Le problème c'est que j'avais passé pas mal de temps a trouver comment je pouvais avoir les infos hardware,et du coup la c'est retour a la case départ ^^.
  • Mais du coup vaut mieux que j'utilise autre chose que popen..
    Non, mais sous Windows il faut utiler _open:
    https://msdn.microsoft.com/en-us/library/96ayss4b.aspx
Connectez-vous ou Inscrivez-vous pour répondre.