-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[12] Come faccio a far partire un processo in background?

Diversi moduli possono far partire altri processi che non bloccano il vostro programma Perl. Potete usare IPC::Open3, Parallel::Jobs, IPC::Run e alcuni dei moduli POE. Consultate CPAN per maggiori dettagli.

Potete anche usare

    system("cmd &")

oppure potete usare fork come documentato in perlfunc/"fork", con ulteriori esempi in perlipc. Alcune cose di cui bisogna essere consapevoli, se si è su un sistema a-la Unix:

  • STDIN, STDOUT, e STDERR sono condivisi

    Sia il processo principale che quello messo in background (il processo "figlio") condividono gli stessi filehandle di STDIN, STDOUT e STDERR. Se entrambi tentano di accedervi contemporaneamente, possono accadere strane cose. Magari chiudeteli e riapriteli per il figlio. Potreste eludere questo tramite l'<open> di una pipe (si veda perlfunc/"open") ma su alcuni sistemi operativi questo significa che il processo figlio non può vivere più a lungo del genitore.

  • Segnali

    Dovrete intercettare il segnale SIGCHLD e forse anche SIGPIPE. SIGCHLD viene inviato quando il processo in background finisce. SIGPIPE viene inviato quando scrivete su un filehandle il cui processo figlio ha chiuso (un SIGPIPE non catturato può causare una terminazione silenziosa del vostro programma). Questo non è un problema con system("cmd&").

  • Zombie

    Dovete essere preparati a "raccogliere" il processo figlio quando finisce.

        $SIG{CHLD} = sub { wait };
        
        $SIG{CHLD} = 'IGNORE';

    Potete utilizzare anche un doppio fork. Aspetterete immediatamente con il wait() il vostro primo figlio, e il demone di init aspetterà con il wait() vostro nipote una volta che questo è uscito.

           unless ($pid = fork) {
              unless (fork) {
                 exec "cosa vuoi fare realmente";
                 die "exec fallito!";
    	  }
              exit 0;
           }
           waitpid($pid,0);

    Consultate perlipc/"Signals" ["Segnali", NdT] per altri esempi di codice per fare questo tipo di cose. Gli zombie non sono un problema con system("prog &").

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google