[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.
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 &").
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.
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!