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 :

Utilisation fork !


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut Utilisation fork !
    Bonjour a tous,

    Voila j'ai bien lu la faq pour fork mais j'ai un petit probleme avec un code deja existant...

    J'ai le code suivant :

    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
         for (;;) {
            my $ongoing = scalar(keys %pidsprots);
            last if !@prots_todo && !$ongoing;
            if ($ongoing >= $PARALLELISM || !@prots_todo) {
                my $donepid = wait;
                next if $donepid < 0; # should never happen?
                my $prot = delete($pidsprots{$donepid}) || next;
                my $start = $protstarttime{$prot};
                info "INFO: Processing of protein '$prot' completed in ",(time-$start)," seconds.\n";
                next;
            }
     
            my $prot = shift(@prots_todo);
            my ($cnt,$fasta) = &ExtractLibSeqs($prot,$SPECIES_LIST,1);
     
            # Filenames
            my $protin  = "XXXX/$prot.seq";
            my $protout = "YYYY/$prot.pir";
            my $aliout  = "$TMPDIR/ZZZZ/${prot}_1.ali";
     
            # Create input file (.seq)
            my $infh = new IO::File ">$protin"
                or die "Can't write to file '$protin': $!\n";
            print $infh $fasta;
            $infh->close();
     
            # Manage child subprocesses.
            if (my $pid = fork()) {
                $pidsprots{$pid}=$prot;
                $protstarttime{$prot}=time;
                info "INFO: Starting processing of '$prot' (with $cnt sequences)\n";
                next;
            }
            # Child starts here
            if ($cnt == 1) {
                system("/bin/cp",$protin,$protout);
            } 
            else {
                system("/bin/sh","-c","$YYYY_EXE -in '$protin' -out '$protout' 1>'Outputs/\LYYYY\E.$prot.out' 2>&1");
                die "Error in processing protein '$prot' with program 'YYYY'; check diagnostic file 'Outputs/\LYYYY\E.$prot.out'.\n"
                    if (! -e $protout);
            }
     
            # Run umac
            system("/bin/sh","-c","$UMAC_EXE -i '$protout' -o '$aliout' -f stockholm 1>'Outputs/\LUMAC\E.$prot.out' 2>&1");
                die "Error in processing protein '$prot' with program 'UMAC'; check diagnostic file 'Outputs/\LUMAC\E.$prot.out'.\n"
                    if (! -e $aliout);
     
            # Make iteration
            my $i = 0;
            my $ResQuali = ();
            my $aliForHmm = $aliout;
            for ( ;; ) {
                $i++;
                my $prothmm = "$TMPDIR/DDDD/${prot}_$i.hmm";
                unlink($prothmm) if (-e $prothmm);
                system("/bin/sh","-c","$EEEE_EXE $prothmm $aliForHmm 1>'Outputs/\LEEEE\E.${prot}_$i.out' 2>&1");
                die "Error in processing protein '$prot' with program 'EEEE' iteration $i; check diagnostic file 'Outputs/\LEEEE\E.${prot}_$i.out'.\n"
                    if (! -e $prothmm);
                my $protaln = "$TMPDIR/ZZZZ/${prot}_$i.aln";
                unlink($protaln) if (-e $protaln);
                system("/bin/sh","-c","$ZZZZ_EXE --outformat stockholm -o $protaln $prothmm $protin 1>'Outputs/\LZZZZ\E.${prot}_$i.out' 2>&1");
                die "Error in processing protein '$prot' with program 'ZZZZ' iteration $i; check diagnostic file 'Outputs/\LZZZZ\E.${prot}_$i.out'.\n"
                    if (! -e $protaln);
                my $quality = &DefQuality($protaln);
                $ResQuali->{$prot}->{$i}    = $quality;
                $aliForHmm = $protaln;
                last if $i == $MaxIteration;
            }
            my $BestIteration = &SelectBestIteration($ResQuali->{$prot});
            system("/bin/cp","$TMPDIR/DDDD/${prot}_$BestIteration.hmm","DDDD/${prot}.hmm");
            system("/bin/cp","$TMPDIR/ZZZZ/${prot}_$BestIteration.aln","ZZZZ/${prot}.aln");
            exit 0;
        }
    Dans le meme programme j'ai une bloc END dans lequel je fait un rmtree de $TMPDIR.

    Donc mon probleme est que le code fonctionne seulement pour la premiere proteine !!! et oui j'efface mon $TMPDIR des la premiere proteine (du au exit 0).

    En suprimmant le bloc END tous rentre dans l'ordre mais le probleme et que je veux continuer a supprimer le repertoire $TMPDIR des que le programme exit, ce qui du coup n'est plus le cas...

    J'ai egalement teste en suprimment le exit 0 present a la fin de ma boucle et je me suis rendu compte que c etait une grave erreur... le programme n'arrete pas de creer des processus en boucle .

    Voila j'aimerais bien avoir quelques conseils...

  2. #2
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Voila la reponse a mon probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    END { 
        # With exit, programme will go here
        # Cleanup temp directory when program exits.
        if ($$ == $PPID) {
        rmtree($TMPDIR);
        }
    }
    Il me sufissait de comparait $PPID (le PID de mon processus principal) avec $$ le PID du processus faisait exit .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exemple d'utilisation des fork
    Par fearyourself dans le forum Télécharger
    Réponses: 1
    Dernier message: 29/12/2013, 02h07
  2. utilisations des fork
    Par hamizou87 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 05/01/2010, 15h02
  3. Utilisation des fork et des pipes
    Par akrogames dans le forum Réseau
    Réponses: 7
    Dernier message: 22/10/2009, 20h22
  4. De la non utilisation du fork
    Par Sékiltoyai dans le forum Réseau
    Réponses: 21
    Dernier message: 22/04/2008, 17h15
  5. Utilisation de tubes dans des fork
    Par je®ome dans le forum Linux
    Réponses: 4
    Dernier message: 31/05/2006, 22h50

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