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

Langage Perl Discussion :

Inclusion programme C dans script perl


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Par défaut Inclusion programme C dans script perl
    Salut a tous

    Voila, je suis super novice en programmation et donc j'ai quelques soucis avec perl. Le probleme est que je ne sais pas comment inclure un programme C a un script perl que j'ai ecrit. Je m'explique; voici le script perl que j'ai etabli :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/usr/bin/perl
    use Asterisk::AGI;
    my $AGI = new Asterisk::AGI;
    $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/vm-enter-num-to-call');
    my $id_borne = $AGI->get_data('/usr/share/asterisk/sounds/beep',5000,4);
    $AGI->verbose("le numero de la borne est $id_borne\n",1);
    et ce que je veux faire c'est utiliser la variable $id_number dans un programme C pour effectuer un traitement sur la borne identifiee par id_number
    j'ai consulte de nombreux tutos, faq, forum, mais malheureusement je n'ai presque rien compris. Si quelqu'un comprend mon probleme et se sent capable de m'expliquer en detail la marche a suivre...
    merci d'avance

  2. #2
    Membre confirmé

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par défaut
    rien compris à ton pb et à ce que tu veux faire :s
    connais pas Asterisk::AGI et j'vois pas trop pourquoi t'en as besoin.
    pose ton pb plus clairement...
    si tu veux juste utiliser un prog C compilé qui prends des éléments en paramètre, fais un simple exec :s
    exec("nom_de_ton_prog $param1 $param2");
    si tu veux récup la sortie du programme, fait ça :
    $sortie=`nom_de_ton_prog $param1 $param2`;

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Assez d'accord avec Ramislebob

    Allez zou, petit bout de code reprenant le tiens :

    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
     
    #!/usr/bin/perl
    use Asterisk::AGI;
     
    my $ProgrammeC = "pouet.exe";
    my $AGI = new Asterisk::AGI;
     
    $AGI->exec('Playback','/usr/share/asterisk/sounds/fr/vm-enter-num-to-call');
    my $id_borne = $AGI->get_data('/usr/share/asterisk/sounds/beep',5000,4);
    $AGI->verbose("le numero de la borne est $id_borne\n",1);
     
    # ici, 2 cas de figure
    # soit, ton script Perl s'arrête une fois qu'il a passé la main au programme C
    exec("$ProgrammeC $id_borne");
     
    # soit, ton script Perl reprend la main après le programme C
    system("$ProgrammeC $id_borne");

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Par défaut
    OK merci bien, et désolé pour mes explications un peu floues. Je vais deja tester ca, et si ca ne marche pas, je reviendrai, en essayant d'etre plus clair c'est promis

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par ramislebob
    rien compris à ton pb et à ce que tu veux faire :s
    connais pas Asterisk::AGI et j'vois pas trop pourquoi t'en as besoin.
    pose ton pb plus clairement...
    si tu veux juste utiliser un prog C compilé qui prends des éléments en paramètre, fais un simple exec :s
    exec("nom_de_ton_prog $param1 $param2");
    Attention !! exec() remplace le processus Perl courant par le programme appelé, autrement dit aucune instruction après le exec() dans le script ne sera exécutée (sauf si le exec échoue bien sûr). On utilise plus souvent system(), qui lance une commande dans un fork et renvoie son code de retour. Ou les backquotes `` qui font de même mais renvoient le contenu de la sortie standard de la commande exécutée.

    (en clair : n'utilisez exec() que s'il s'agit de la dernière instruction de votre script)

    (Je viens de m'apercevoir qu'Arioch avait déjà mis cette explication, mais juste pour insister je vais laisser la mienne aussi )

    Il est également possible d'inclure du C dans un programme Perl simplement avec Inline::C, ou de faire appel à des fonctions d'une librairie partagée (.dll ou .so) avec P5NCI.

    --
    Jedaï

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par Jedai
    (Je viens de m'apercevoir qu'Arioch avait déjà mis cette explication, mais juste pour insister je vais laisser la mienne aussi )
    Ah merci Jedai, quand je t'ai lu j'ai cru que j'avais encore dit une bêtise

    $Arioch =~ s/bêtise/connerie/gi;

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    Citation Envoyé par Jedai
    (...) ou de faire appel à des fonctions d'une librairie partagée (.dll ou .so) avec P5NCI.
    tu l'as deja essayé essayé P5NCI? Si oui, ca marche bien?
    J'etais assez curieux de savoir ce que ca donnait quand je l'ai vu debarquer sur CPAN, mais j'ai pas eu l'occasion/temps/courage de l'essayer;
    Une solution pure perl pour inclure des librairies C c'est assez tentant! (enfin il y a un sous module qui s'appel P5NCI::GenerateXS, alors que la doc dit qu'on a pas besoin de compilation...?)

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Ce n'est pas une solution pure perl, ça s'appuie sur du XS en sous main, qui est généré par GenerateXS justement, mais uniquement à l'installation de P5NCI, pas à son utilisation ! En fait il génère à l'avance le XS nécessaire à l'appel de l'ensemble des signatures possibles (on est donc limité dans les signatures des fonctions qu'on peut appeler, ce n'est pas une solution à tous les problèmes, mais c'est déjà pas mal), pour que tu n'ais plus besoin de le faire quand tu utilises son module.
    En bref c'est très bien dans un grand nombre de cas, mais insuffisant pour les cas complexes (où tu as des types non standard dans les signatures ou des signatures trop longues (P5NCI est limité à 4 arguments)) où on doit se rabattre vers Inline::C ou XS (Inline::C génère automatiquement son XS dans la plupart des cas, mais il exige tout de même une compilation puisqu'il le fait à la compilation du script Perl (seulement si le code C a changé depuis sa dernière compilation)).
    XS est en fait la seule "vraie" interface entre Perl et C, mais il y a plein de façon de le faire générer automatiquement dans les cas simples. Ce qu'apporte P5NCI c'est qu'il n'y a plus besoin de compilation pour l'utiliser dans ton code.

    --
    Jedaï

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    ok, donc il doit generer un paquet de code à l'avance.
    Tu l'a essayé?

  10. #10
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Je ne l'ai pas essayé, mais je ne doute pas qu'il fonctionne, car j'ai déjà essayé Inline::C qui fonctionne un peu sur les même principes (mais exige une recompilation) et ai pu constater un fonctionnement excellent sous Windows comme sous Unix. De plus P5NCI s'appuie sur Dynaloader qui est un module très utilisé et donc un quasi standard, et son auteur est bien connu, je n'ai aucune raison de penser qu'il ne fonctionne pas. Je vais l'essayer demain et je te dirais les résultats.

    --
    Jedaï

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Par défaut
    oui inlice C marche tres bien, et son typemap aussi (c'est d'ailleurs exactement le meme que XS, puisque inline ne fait que generer les signatures de fonction XS autour du code C inliné). Ce qui est chiant avec inline est que ca n'est pas un moduyle standard, et du coup l'auteur d'un module l'utilisant est obligé de recuperer le XS généré pour publier son module sur CPAN en ayant la conscience tranquille, c'est dommage...
    (d'ailleurs il y a un excellent module pour gerer ca sans devoir bidouiller ou ajouter expres une erreur dans le code pour que le XS ne soit pas effacé: http://search.cpan.org/~sisyphus/Inl...S-0.03/C2XS.pm)

    Je ne doute pas nonplus que ce module marche, mais j'aimerais un peu avoir des retours d'experience dessus. Du coup j'attend ton experience avec impatience

Discussions similaires

  1. Problème de script Bash dans script Perl
    Par Aviator dans le forum Langage
    Réponses: 3
    Dernier message: 03/01/2008, 20h50
  2. commande awk dans script perl
    Par sorilazer dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2007, 10h16
  3. script perl dans script perl et retour derreur..
    Par kiza dans le forum Langage
    Réponses: 7
    Dernier message: 02/12/2005, 15h36
  4. [langage] Probleme avec caractère '$' dans script Perl
    Par zouetchou dans le forum Langage
    Réponses: 11
    Dernier message: 24/07/2004, 15h35
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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