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

Programmation et administration système Perl Discussion :

Peut-on récupérer les STDOUTS d'executables lancés grâce à fork?


Sujet :

Programmation et administration système Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Par défaut Peut-on récupérer les STDOUTS d'executables lancés grâce à fork?
    Bonjour,

    j'ai posté une discussion analogue il y a deux semaines mais je me suis trompé de forum et/ou je ne suis vraiment pas clair, vu le nombre de réponse (=0).

    Je souhaite lancer plusieurs fois en parallèle un exécutable grâce à fork.
    Cet exécutable me prévient de l'avancée des calculs en affichant régulièrement des points dans la console...
    Je voudrais bien récupérer "court-circuité" les sorties standards des fils,
    compter les points, et par exemple afficher un point quand tous les fils en ont envoyé un.
    Est-ce que cela est possible?
    Si oui, quelqu'un pourrait-il m'indiquer les fonctions à utiliser pour gérer les entrées/sorties?

    Je colle mon bout de code comme base, mais évidemment ça ne fait pas le travail.
    (il récupère bien les sorties standards mais une fois l'executable terminée...je devrais surement utiliser exec()...)

    Merci beaucoup!

    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
    26
    27
    28
    #!/usr/bin/perl
     
    use strict;
     
    my $File=shift;
    my $num_threads=8;
    my @pid;
     
    for(my $i=0;$i<$num_threads;$i++){
     
    	pipe(FAT_R,SON_W);
    	if($pid[$i]=fork) {
    		close(SON_W);
    		while(<FAT_R>){
    			print $_;
    		}		
    		close(TOTO);
    	}else{
    		close(FAT_R);
    		my @command("le_prog","$file");
    		print SON_W `@command`;
    		exit(0);
    	}
    }
     
    foreach(@pid){
    	waitpid($_,0);
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Par défaut
    Bonjour,

    Plusieurs remarques :
    • La partie du processus père :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      while(<$FAT_R>){
      	print  $_;
      }
      attend la fermeture de FAT_R, ce qui empêche la création initiale des processus (dans ton code les fork s’exécutent l'un après l'autre). il me semble que tu devrai créer les processus et ensuite attendre la réponse.

    • Pour un dialogue indépendant avec chaque fils je ferai un pipe par fils, IO::Select te permet de gérer un dialogue avec les fils voir http://perldoc.perl.org/IO/Select.html.

    • Tu peux peut-etre réussir à faire ce que tu veux avec IPC:Run qui te permet de jouer avec les entrées sorties d'un processus par ex avec une fonction perl :
      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
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      #!/usr/bin/perl
       
      use strict;
      use warnings;
       
      use IO::Select;
      use IO::Handle;
       
      use IPC::Run qw( run start );
       
      $| = 1;
       
      sub child {
       
      	$| = 1;
      	# $$ est le pid du processus courant
      	print( "$$ : debut\n" );
      	sleep int(rand(10));
      	print( "$$ : fin\n" );
      	close STDOUT;
      	sleep 2;
      	exit int(rand(10));
       
      }
       
      my $sel = IO::Select->new();
      my %ipcrs;
       
      foreach my $i ( 1 .. 8 ) {
      	my $h = IO::Handle->new();
      	# demarre un nouveau processus en arriere plan
      	$ipcrs{"$h"} = start( \&child, '>pipe', $h );
       
      	$sel->add( $h );
      }
       
      while( my @ready = $sel->can_read() ) {
      	foreach my $h ( @ready ) {
       
      		my $line = $h->getline();
       
      		if ( not defined $line ) {
       
      			my $kpid = $ipcrs{"$h"}->{KIDS}->[0]->{PID};
      			print( "fermeture du handle : $kpid\n" );
      			$sel->remove( $h );
      			$ipcrs{"$h"}->finish();
      			my $rt = $ipcrs{"$h"}->result;
      			print( "fin du processus : $kpid, retour : $rt\n" );
       
      		} else {
      			print $line;
      		}
      	}
      }
      voir http://search.cpan.org/~toddr/IPC-Ru...lib/IPC/Run.pm

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Par défaut
    oh, merci pour ces conseils,
    je teste ça dès que possible!

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/10/2013, 16h05
  2. Réponses: 2
    Dernier message: 07/11/2011, 08h06
  3. Récupérer les valeurs du formulaire dans execute()
    Par handsome01 dans le forum Struts 1
    Réponses: 10
    Dernier message: 28/03/2009, 03h19
  4. Executer une proc stockee et récupérer les valeurs ?
    Par goofer dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/09/2008, 11h05
  5. Récupérer les informations de stdout
    Par acryline dans le forum C
    Réponses: 4
    Dernier message: 02/05/2008, 18h27

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