IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Instruction Unix et CPP


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut Instruction Unix et CPP
    bonjour à tous,

    Voila, j'ai un code CPP où j'utilise la fonction System pour lancer une instruction unix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void eBibleMainWindow::Wconnect()
    {
                    system("echo `ifconfig eth0| grep HWaddr | awk '{ print $5 }'` > /var/tuxbox/plugins/macadress.cfg");
    }
    En fait je voudrais dans mon code cpp avoir une variable dans laquelle se stockera la valeur de l'instruction unix au lieu de la mettre dans le fichier 'macadress.cfg'.

    Merci pour votre aide.

  2. #2
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    En ce qui concerne le traitement de commandes Bash complexes avec les ressources de Qt, tu pourras regarder ceci :
    http://qt.developpez.com/faq/index.p...ir_application
    mais même cela ne permet pas d'éviter le détour par le recueil des données de sortie dans un fichier.

    D'autres idées ?

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    En ce qui concerne le traitement de commandes Bash complexes avec les ressources de Qt, tu pourras regarder ceci :
    http://qt.developpez.com/faq/index.p...ir_application
    mais même cela ne permet pas d'éviter le détour par le recueil des données de sortie dans un fichier.

    D'autres idées ?
    Ok merci.

    Dans ce cas comment je fais pour prendre la valeur de la ligne du fichier 'macadress.cfg' et lla mettre dans une variable cpp?

    Est ce que je peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class eBibleMainWindow: public eWindow
    {
    	(...)
    public:
            String MacVar ;
    };
     
    void eBibleMainWindow::Wconnect()
    {
                    system("echo `ifconfig eth0| grep HWaddr | awk '{ print $5 }'` > /var/tuxbox/plugins/macadress.cfg");
     
    ifstream file( "/var/tuxbox/plugins/macadress.cfg" );
    getline( file, MacVar );
     
    }
    Merci.

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Quelqu'un pourrait me dire si mon code est bon SVP?

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Il fau pour celà utiliser popen, pas system. popen est fait exprès : ça crée un process shell, execute une commande, et te permet d'utiliser les fonctions de gestion de flux pour lire le résultat de cette commande sans avoir besoin de créer un fichier temporaire.

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Il fau pour celà utiliser popen, pas system. popen est fait exprès : ça crée un process shell, execute une commande, et te permet d'utiliser les fonctions de gestion de flux pour lire le résultat de cette commande sans avoir besoin de créer un fichier temporaire.
    Je te remercie pour l'information.

    Est ce que tu pourrais me dire STP est ce que mon dernier code marche pour stocker la ligne existante dans le fichier au sein de la variable MacVar?
    Car en fait je suis novice et je voudrais simplement faire de la façon la plus simple...

  7. #7
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir.

    Ton code devrait fonctionner correctement.
    Du moins s'il n'y a qu'une seule ligne écrite...

    Sinon, en C++ les types standards s'écrivent tout en minuscules.

  8. #8
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Quelqu'un pourrait me dire si mon code est bon SVP?
    le plus simple n'est il pas de le tester?
    il pourrait marcher sous linux mais pas sous windows, déjà.
    pour le reste, on est pas des machines donc que l'on dise oui ou non, on peut se tromper. Le mieux c'est de le compiler et de demander a la machine =)

  9. #9
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Est ce que tu pourrais me dire STP est ce que mon dernier code marche pour stocker la ligne existante dans le fichier au sein de la variable MacVar?
    Ta question me laisse un peu perplexe : le plus simple pour commencer, n'aurait-il pas été de faire tourner ce code (ou au moins la fonction qu'il contient réduite à elle-même) et de voir toi-même s'il compile, s'exécute et donne le résultat souhaité !!?

    Tu peux tenter par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
     
    using namespace std;
     
    void wconnect()
    {
        system("echo `ifconfig eth0| grep HWaddr | awk '{ print $5 }'` > macadress.cfg");
    }
     
    int main()
    {    
        wconnect();
    }

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Je vous remercie tous,

    je vais tester cela et revenir vers vous...

  11. #11
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Il fau pour celà utiliser popen, pas system. popen est fait exprès : ça crée un process shell, execute une commande, et te permet d'utiliser les fonctions de gestion de flux pour lire le résultat de cette commande sans avoir besoin de créer un fichier temporaire.
    Il semblerait qu'on puisse aussi utiliser PStream :
    http://pstreams.sourceforge.net/doc/
    Quelqu'un connaît ?

  12. #12
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour.

    Je ne connaissais pas les pstreams, mais ça me fait penser qu'il y a un moment, j'avais voulu faire des classes pour pouvoir utiliser facilement les descripteurs de fichiers retournés notamment par popen() ou pipe() via des {i,o}streams.
    Comment j'avais appelé ça, déjà ?
    Ah oui... pstream...

    J'avais eu cette idée à la suite de la découverte de la classe __gnu_cxx::stdio_filebuf, héritant de std::basic_filebuf.
    Elle permet de créer des objets « buffer » compatibles avec les flux de la STL à partir de descripteur de fichier ou de FILE*.
    Il suffit de s'inspirer largement des classes std::{i,o,}fstream, et le tour est joué !

    Le seul problème, c'est que c'est une extension GNU (#include <ext/stdio_filebuf.h>)...

  13. #13
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Il y a aussi les Boost.Process :
    http://www.highscore.de/boost/process/
    (qui ont toutefois été refusés en février dernier pour l'intégration officielle à Boost, voir les commentaires du 'jury' ici http://lists.boost.org/boost-announce/2011/03/0292.php)

  14. #14
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Une réponse à l'auteur du fil en utilisant popen pourrait être quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <iostream>
    #include <cstdio>
    #include <string>
     
    using namespace std;
     
    const string shell_output(const char * const command)
    {
        FILE *source = popen(command, "r" );
        char buff[50];
        string output("");
     
        while ( fgets( buff, sizeof buff, source )  )
            output += buff;
     
        pclose(source);
        return output;
    }
     
    int main()
    {
        string sortie;
        sortie = shell_output("ifconfig eth0 | grep HWaddr | awk '{ print $5 }'");
        cout << sortie;
    }
    Nous sommes bien sûr dans le monde Unix.
    Le programme sera à lancer sous 'root', la commande ifconfig n'étant pas accessible aux simples utillisateurs.

  15. #15
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Et s'il dispose des extensions GNU...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <ext/stdio_filebuf.h>
     
     
    __gnu_cxx::stdio_filebuf<char> fb(popen(command, "r"), std::ios::in);
    if (fb.is_open()) {
        std::istream is(&fb);
        // Chouette, c'est un flux C++ standard !!
        (...)
    }
    else
        std::cerr << "Impossible de lancer la commande " << command << std::endl;
    Le FILE* retourné par popen() est automatiquement fermé à la destruction de fb.
    C'est pas beau, ça ?

    Bon, je sais, ça reste une extension GNU...

  16. #16
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Nous sommes bien sûr dans le monde Unix.
    Le programme sera à lancer sous 'root', la commande ifconfig n'étant pas accessible aux simples utillisateurs.
    Si, ifconfig est souvent accessibles aux utilisateurs, mais ils ne peuvent pas modifier l'adresse IP d'une interface ou ajouter une interface. Mais ça peut être utile, ne serait-ce que pour trouver l'adresse MAC d'une interface particulière ou savoir si elle est up ou down. Sur debian, ifconfig est dans sbin, et sbin n'est pas dans le path. Le simple fait de rajouter sbin dans le path rends la commande exécutable (pas beau, mais viable). Sur ubuntu, rien besoin de faire : ifconfig est toujours disponible.

    Sinon, pour les stream buffer, cet article semble relativement complet, et il doit être possible d'en sortir quelque chose... http://spec.winprog.org/streams/

Discussions similaires

  1. commandes et instructions unix
    Par astro1976 dans le forum Unix
    Réponses: 4
    Dernier message: 07/04/2010, 14h04
  2. [langage] Commande Unix en Perl
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2002, 11h59
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 12h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 15h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 20h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo