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 :

multi processus perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par défaut multi processus perl
    bonjour, à partir de ce petit programme de test, j'aimerais pouvoir créer 5 processus fils qui dialoguent avec leur pere.
    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
    #!/usr/bin/perl
     
    use IO::Handle ;
     
    pipe ( ENTREE , SORTIE ) ;
    SORTIE -> autoflush ( 1 ) ;
     
    $pid = fork ( ) ;
     
     
    if ( $pid != 0 ){
            close ( SORTIE ) ; # Le processus pere n'a pas à écrire dans le tube.
            print "ttt\n";
            waitpid ( $pid , 0 ) ;
            my @message = <ENTREE> ;
            print "Message du fils : @message\n" ;
    }
    else{
            close ( ENTREE ) ; # Le processus fils n'a pas à lire dans le tube.
     
            for($i=0;$i<20;$i++){
                    print SORTIE "$i fils $$.\n" ;
            }
    }
    que dois je ajouter ?

    Merci.

  2. #2
    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
    Tout d'abord : ON NE POSTE PAS DANS CE FORUM, on poste dans les sous-forums, comme c'est clairement indiqué en haut de ce forum... Ton prochain message ici sera supprimé sans avertissement (à part un MP), pour celui-ci je me contente de le déplacer dans le sous-forum Langage.

    Ensuite pour répondre à ta question, il faut que tu mettes l'ensemble de ton exemple dans une boucle, mais plutôt que d'utiliser la fonction pipe(), je te conseille d'utiliser le module IO::Pipe, livré en standard depuis Perl5.4 et qui t'évitera les collisions de noms.

    --
    Jedaï

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par défaut
    ok, pardon m'sieur

    mais comment tu distingue les differents fils ?

  4. #4
    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
    Et bien tu utilises deux tableaux, un pour retenir les pids des fils et un pour retenir les pipes en lecture correspondants, et ensuite tu utilises IO::Select pour gérer simultanément la lecture sur tous les pipes, ou peut-être pas, peut-être que tu peux te contenter de les lire séquentiellement, tout dépend de ce que tu veux faire avec tes 5 fils. Si tu nous donnes plus de détails sur le but, nous pourrons mieux t'aider sur les moyens.

    --
    Jedaï

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 210
    Par défaut
    bon, j'ai un probleme :

    Le pere ne voit pas ses fils mourir

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    sub genXmlInfoHotel{
    	my @listeHotel = @_;
     
    	#my $pipeFils_Pere = new IO::Pipe;
    	my $isPere=0;
    	my $nbHotels = scalar(@listeHotel);
    	@tableauxPipe=qw();
    	@fils=qw();
     
    	#Creation des "nbProcessus" Processus
    	for (my $indice=0;$indice<$nbProcessus;$indice++){
    		push @tableauxPipe, new IO::Pipe;
    		$isPere = fork ();
     
    		#Les process fils recup les infos de l'hotel		
    		if (! ($isPere)){	
    			#$pipeFils_Pere->writer();
    			$tableauxPipe[$indice]->writer();
     
    			#Pour chaques hotels attribués a ce process			
    			for(my $j=$nbHotels*(($indice/$nbProcessus)-(1/$nbProcessus));$j<$nbHotels*($indice/$nbProcessus);$j++){
     
    				$hotelId = $listeHotel[$j][0];
    				$hotelNom = $listeHotel[$j][1];
    				$dispo = "";
    				$enLigne = "";
    				my $dateOuv = "";
    				if ($hotelId > 0){
    					isOnLine();
    					print "fils $indice :: hotel : $hotelId :++: online : $enLigne \n";
    					getDateOuverture();
    					getDispo();
    					$str = "<hotel id=\"".$hotelId."\" nom=\"".$hotelNom."\"><nbChDispo>".$dispo."</nbChDispo><ouverture>".$dateOuv."</ouverture><enLigne>".$enLigne."</enLigne></hotel> \n";
    					print {$tableauxPipe[$indice]} $str;
    					#print $pipeFils_Pere $str;
    				}
    			}
    			print "fin fils $indice : $isPere \n";
    			exit(0);
    		}
    		#Construction du tableaux de fils
    		push @fils,$isPere;
    		print "je viens de cree les process : 	$isPere\n";	
    	}
     
    	# Le process pere attend la mort des fils
    	foreach $pid (@fils) {
    		print "attends mort fils $pid \n";
    		print "-->" . waitpid($pid, 0);
    		print "mort du fils $pid \n";
    	}
     
    	# Le process pere cré le fichier xml et recup par pipe les infos des fils
    	my $fh = new FileHandle "> $locationXmlFile";
    	if (!defined $fh){   
    		print "Erreur : PB de creation du fichier XML";
    	}  		
     
    	print $fh "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> \n";
    	print $fh "<listesHotels> \n";
     
    	print "papa\n";
    	# Lecture des pipes
    	for (my $indice=0;$indice<$nbProcessus;$indice++){
    		$tableauxPipe[$indice]->reader();
    		while( defined( my $line = $tableauxPipe[1]->getline )) {
    			print $fh "$line";
    			print "tot\n";
    		}
    	}
    	print $fh "</listesHotels> \n";
    	$fh->close;
    	print "fin pere\n";
     
    }
    ce code donne les traces suivantes
    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
    ./checkHotels2.pl
    je viens de cree les process :  20157
    je viens de cree les process :  20158
    je viens de cree les process :  20159
    je viens de cree les process :  20160
    fin fils 3 : 0
    je viens de cree les process :  20161
    attends mort fils 20157
    fils 0 :: hotel : 4318 :++: online : 1
    fils 4 :: hotel : 0568 :++: online : 1
    fils 2 :: hotel : 4121 :++: online : 1
    fils 1 :: hotel : 0007 :++: online : 1
    fils 1 :: hotel : 0492 :++: online : 1
    fils 4 :: hotel : 4244 :++: online : 1
    .......
    fin fils 4 : 0
    fils 1 :: hotel : 4121 :++: online : 1
    fils 0 :: hotel : 4502 :++: online : 1
    fin fils 1 : 0
    fils 0 :: hotel : 4211 :++: online : 1
    fils 0 :: hotel : 4281 :++: online : 1
    fils 0 :: hotel : 0563 :++: online : 1
    fils 0 :: hotel : 0007 :++: online : 1
    fin fils 0 : 0
    fils 2 :: hotel : 4142 :++: online : 1
    fils 2 :: hotel : 4509 :++: online : 1
    fils 2 :: hotel : 4354 :++: online : 1
    fils 2 :: hotel : 4706 :++: online : 0
    fils 2 :: hotel : 0304 :++: online : 1
    ......
    fin fils 2 : 0
    comme vous le voyez j'ai un probleme dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Le process pere attend la mort des fils
    	foreach $pid (@fils) {
    		print "attends mort fils $pid \n";
    		print "-->" . waitpid($pid, 0);
    		print "mort du fils $pid \n";
    	}
    PS : j'ai un poste dans la partie module pour la gestion des pipes je me suis encoure gouré

  6. #6
    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
    Peut-être devrais-tu vérifier la mort de tes fils après avoir lu leur pipe...

    --
    Jedaï

Discussions similaires

  1. Changer le nom du processus (Perl.exe par monscirpt.pl)
    Par Julon dans le forum Programmation et administration système
    Réponses: 8
    Dernier message: 08/06/2009, 21h51
  2. Problème Processus "perl.exe" Oracle 10g
    Par mugla dans le forum Installation
    Réponses: 2
    Dernier message: 11/12/2007, 10h19
  3. Programme multi processus qui marche aléatoirement
    Par Anonymouse dans le forum Linux
    Réponses: 1
    Dernier message: 13/10/2007, 20h56
  4. generation xml multi processus
    Par mickael.guilbert dans le forum Modules
    Réponses: 3
    Dernier message: 28/05/2007, 19h46
  5. PID processus perl
    Par crochepatte dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2006, 14h46

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