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 :

Interception des outputs C/fortran depuis C++


Sujet :

C++

  1. #1
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut Interception des outputs C/fortran depuis C++
    Bonjour,

    Mon but est de bufferiser dans une variable tous les outputs, sur stderr ou stdin de routines appelés dans une librairie qui utilise du C et du fortran.

    Voilà où j'en suis après qques moments passé sur google.

    Si intercepter des outputs (par cout) en C++ est assez simple (utilisation des stringstream et consort), et que pour le C on pour se débroutiller par setbuf/setvbuf, je ne trouve aucun moyen pour intercepter les outputs de program fortran ( la méthode setbuf ne marche pas).

    Je cherche donc un moyen d'intercepter tous les outputs et les enregistrer dans un buffer qui marcherait pour C/fortran..

    Une idée?

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Il est aussi possible de rediriger les sorties stderr et stdout de tout un programme vers un pipe et de lire ce pipe, tu en penses quoi ?

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634

  4. #4
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Malheureusement l'idée de créer un processus fils pour intercepter les outputs ne me semble pas viable:

    1/ les routines utilisées dont je veux intercepter l'output peuvent être multithreadés via OpenMP
    2/ je travaille de surcroît dans un environnement MPI

    L'idée de forker des processes (un par process MPI) risque de bloquer mes ressources et d'overloader la machine juste pour trapper des outputs....

    A moins que je comprenne pas qqchose.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    La création d'un child process c'est juste pour lancer un exécutable dont tu veux mapper les entrées/sorties (stdin,err,out) sur des pipes maîtrisées par ton processus de bufferisation. Ensuite, que cet exécutable distribue son calcul, grand bien lui fasse du moment que la gestion des I/O est correcte.

  6. #6
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Si par exemple j'ai 4 coeurs sur ma machine...
    Je lance le programme sur 1 process.
    Je spawne un process pour trapper les outputs.
    Le process spawné va utiliser des pragmas OpenMP ou autres, sur 4 threads.

    Si je compte bien ça fait 5 processes sur une machine de 4 coeurs. Et ça c'est pas bon. Il faut bien que le process père continue à vivre pour récupérer les out de son fils via le pipe...

    On a donc un process en trop qui spin à 100% de consommation CPU, pour rien. Enfin si pour des outputs qui arriveront plus lentement...

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Fortran90 Voir le message
    On a donc un process en trop qui spin à 100% de consommation CPU, pour rien. Enfin si pour des outputs qui arriveront plus lentement...
    Je ne sais pas trop ce que signifie spin, mais j'ose espérer qu'une attente sur un pipe n'est pas implémentée comme une attente active. Ensuite, de deux choses l'une : soit la tâche de bufferisation des E/S est déléguée à un process (ou un thread) dédié - ce qu'il m'avait semblé comprendre de ta question première - et alors il faut bien lui donner aussi du temps CPU pour réaliser sa tâche. Soit chaque tâche s'en occupe et alors cette gestion doit être explicitement faite au sein de celles-ci (ou avec un outil permettant de la programmation par aspect) mais ne peut plus être détachée dans un programme séparé.
    Ou quelque chose m'échape

  8. #8
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Par spin, il faut comprendre ce que tu as compris.

    Le problème est que le type d'attente lors d'un pipe implémenté en C par exemple va dépendre, à mon humble avis, du compilateur. J'ai déjà vu un process qui était en attente active dans un wait après un fork avec le compilateur portland...d'où le sens de mes remarques.

    De plus, si le process père pèse lourd en RAM, ce qui est mon cas, je ne peux pas me permettre de dupliquer le process par un fork.

    Après je ne suis pas expert ès pipe...

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    J'ai l'impression qu'il y a quelque chose qui m'échappe : ton use-case, c'est quoi :
    1/ Les librairies C et/ou Fortran sont invoquées depuis un processus qui veut monitorer leur E/S ?
    2/ Les librairies C et/ou Fortran sont invoquées dans un processus différent de celui qui veut monitorer leur E/S ?

  10. #10
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    C'est la situation numéro 1. Typiquement un calcul hybride ( mpi et openMP ).

  11. #11
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Si ton thread en attente spin à 100%, c'ets que ton OS est bien moisi. Un thread en attente via le scheduler ne consomme pas de ressource.

    Tu te rends compte que la ta machine fait tourner 400-500 threads sur 2-4 cores rien que pour l'OS ? et que bon, ton CPU ets pas à 100 % ?

    La solution de Archi3D est correcte.

  12. #12
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Oh mais j'ai pas dit qu'elle n'est pas correcte.

    J'ai juste dit que ça colle pas avec mes besoins. J'ai l'impression d'écraser une mouche avec une patte d'éléphant.

    Par contre pour les processus tu as entièrement raison...et en fait je me souviens avoir vu ça pour des processus openMP pour le compilateur portland, rien à voir avec un OS moisi.

    Par contre, j'aimerai être sûr...

    Quand je fais le pipe, la mémoire des processus "père et fils" est elle dupliquée ou partagée?

  13. #13
    Membre confirmé Avatar de Fortran90
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 83
    Par défaut
    Personne n'a idée ?

Discussions similaires

  1. [Débutant] Intercepter des Erreurs depuis un DataGriview lié.
    Par boby15000 dans le forum VB.NET
    Réponses: 0
    Dernier message: 20/03/2015, 14h00
  2. [WD16] Intercepter des Evenements Windows depuis une classe
    Par dahlback dans le forum WinDev
    Réponses: 8
    Dernier message: 15/01/2013, 13h55
  3. Intercepter des Evenements Windows depuis une classe
    Par jimmypage dans le forum WinDev
    Réponses: 4
    Dernier message: 13/07/2012, 17h01
  4. interception des output console
    Par r0d dans le forum C#
    Réponses: 2
    Dernier message: 19/10/2011, 14h08
  5. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55

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