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

POSIX C Discussion :

Utilisation de popen


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut Utilisation de popen
    Bonsoir a tous voila, j aimerai savoir a koi sert exactement la fonction popen et si elle est utilisable sous windows car je pense qu'elle pourrai mettre utille pour mon programme mais je ne sais comment l'utilise (je debute en c).Je me suis bien evidament referencer a man page mais leur explication est sans nul doute un peu trop technique pour un debutant comme moi. Si c'etait possible d'avoir un petit exemple ou meme un prototype de la fonction assez simple se serai tres sympa merci d'avance

  2. #2
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    POPEN(3) Manuel du programmeur Linux POPEN(3)

    NOM
    popen, pclose - Entrées-sorties pour un processus

    SYNOPSIS
    #include <stdio.h>

    FILE *popen (const char *commande, const char *type);

    int pclose (FILE *stream);

    DESCRIPTION
    La fonction popen() engendre un processus en créant un tube (pipe), exécutant un fork(2), et en invoquant le shell.
    Comme un tube est unidirectionnel par définition, l’argument type doit indiquer seulement une lecture ou une écriture,
    et non pas les deux. Le flux correspondant sera ouvert en lecture seule ou écriture seule.

    L’argument commande est un pointeur sur une chaîne de caractères, terminée par un octet nul, et contenant une ligne de
    commande shell. Cette commande est transmise à /bin/sh en utilisant l’option -c. L’interprétation en est laissée au
    shell.

    L’argument type est un pointeur sur une chaîne de caractères, terminée par un octet nul, qui doit contenir « r » pour
    la lecture ou « w » pour l’écriture.

    La valeur renvoyée par popen() est un flux d’entrée-sortie normal, à la seule différence qu’il doit être fermé en
    appelant pclose() à la place de fclose(3). L’écriture dans le flux correspond à écrire sur l’entrée standard de la
    commande. Le flux de sortie standard de la commande est le même que celui du processus appelant popen(), à moins que
    la commande le modifie. Symétriquement, la lecture depuis un flux ouvert par popen() correspond à lire la sortie stan-
    dard de la commande, et dans ce cas l’entrée standard de la commande est la même que celle du processus appelant
    popen().

    Notez que, par défaut, les flux de sortie fournis par popen() disposent d’un tampon.

    La fonction pclose() attend que le processus correspondant se termine, et renvoie alors l’état de sortie de la com-
    mande, comme en utilisant wait4(2).

    VALEUR RENVOYÉE
    La fonction popen() renvoie NULL si l’appel système fork(2) ou pipe(2) échoue, ou s’il n’a pas assez de mémoire.

    La fonction pclose() renvoie -1 si wait4(2) échoue, ou si une autre erreur est détectée.

    ERREURS
    La fonction popen() ne remplit pas errno si une allocation mémoire échoue. Si les appels fork(2) ou pipe(2) sous-
    jacents échouent, errno est correctement rempli. Si l’argument type est invalide, et si cette condition est détectée,
    errno contient EINVAL.

    Si pclose() n’arrive pas à obtenir l’état du fils, errno contient ECHILD.



  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    popen est une fonction POSIX qui permet de créer un tube, d'exécuter une commande (exactement comme ce qui se passe avec la fonction system) et de rediriger l'entrée et/ou les sorties standard de cette commande vers le tube ainsi créé. Comme certainement ton problème n'est pas son lien avec le thread que t'as créé sur le forum Programmation Windows, je suppose que tu est sous Windows et dans ce cas, tu devrais plutôt utiliser la fonction _popen (qui est popen qui a changé de nom sous Windows), conformément aux recommandations de Microsoft.

    PS: Toutes les fonctions non standard (ANSI C) de la bibliothèque d'exécution du C de Microsoft commencent par un underscore (_). Cela permet de savoir immédiatement si une fonction est standard ou nom rien qu'en regardant son nom. Il y a peut-être quelques exceptions.

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Melem Voir le message
    Comme certainement ton problème n'est pas sans lien avec le thread que t'as créé sur le forum Programmation Windows, je suppose que tu est sous Windows et dans ce cas, tu devrais plutôt utiliser la fonction _popen (qui est popen qui a changé de nom sous Windows), conformément aux recommandations de Microsoft.
    Seulement s'il utilise les fonctions Windows, il peut très bien se tourner vers cygwin et disposer de popen() normalement.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par Melem Voir le message
    rediriger l'entrée et/ou les sorties standard
    Pas "et/ou", hélas. C'est "ou", un "ou" tout ce qu'il y a de plus exclusif. On ne peut pas rediriger à la fois l'entrée et la sortie standard avec popen().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pas "et/ou", hélas. C'est "ou", un "ou" tout ce qu'il y a de plus exclusif. On ne peut pas rediriger à la fois l'entrée et la sortie standard avec popen().
    Ah oui c'est vrai, un tube c'est toujours à sens unique.

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Melem Voir le message
    Ah oui c'est vrai, un tube c'est toujours à sens unique.
    Même remarque : http://www.developpez.net/forums/sho...8&postcount=12

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/12/2015, 08h15
  2. Utilisation de os.system ou subprocess.Popen
    Par othke dans le forum Général Python
    Réponses: 8
    Dernier message: 28/09/2011, 12h05
  3. Réponses: 5
    Dernier message: 16/02/2011, 10h23
  4. popen comment utiliser!
    Par laracroft87 dans le forum Linux
    Réponses: 1
    Dernier message: 05/04/2009, 11h46
  5. Programme avec processes et utilisation de popen
    Par Johan.Mazel dans le forum Général Python
    Réponses: 12
    Dernier message: 28/03/2008, 18h47

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