(contributo di brian d foy)
Non c'è un unico modo per eseguire codice in background in modo da non dover aspettare perché finisca prima che il tuo programma passi ad altre attività. La gestione dei processi dipende dal particolare sistema operativo e molte delle tecniche sono in perlipc.
Diversi moduli CPAN possono essere in grado di aiutare, tra cui IPC::Open2 o IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, Proc::Background e Win32::Process. Ci sono molti altri moduli che potresti usare, quindi controlla anche questi spazi dei nomi per altre opzioni.
Se siete su un sistema Unix-like, si potrebbe essere in grado di cavarsela con una chiamata di sistema in cui si mette un & sulla fine del comando:
system("cmd &")
Si può anche provare a utilizzare la forcella , come descritto in perlfunc (sebbene questa sia la stessa cosa che molti dei moduli faranno per te).
STDIN, STDOUT e STDERR sono condivisi
Sia il processo principale e quello in background (il processo "figlio") condividono gli stessi filehandle stdin, stdout e stderr. Se entrambi provano ad accedervi contemporaneamente, possono accadere cose strane. Potresti voler chiudere o riaprire questi per il bambino. È possibile aggirare questo problema aprendo una pipe (vedere open in perlfunc) ma su alcuni sistemi ciò significa che il processo figlio non può sopravvivere al genitore. Segnali Dovrete prendere il segnale SIGCHLD e possibilmente anche SIGPIPE. SIGCHLD viene inviato quando il processo in background termina. SIGPIPE viene inviato quando si scrive su un filehandle il cui processo figlio è stato chiuso (un SIGPIPE non mappato può causare la morte silenziosa del programma). Questo non è un problema con il sistema ("cmd &").
Zombies
Devi essere pronto a "raccogliere" il processo figlio quando finisce.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
È anche possibile utilizzare una doppia forcella. Attendi immediatamente() per il tuo primo figlio e il demone di init aspetterà() per il tuo nipote una volta che esce.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Vedi Segnali in perlipc per altri esempi di codice per fare questo. Gli zombi non sono un problema con il sistema ("prog &").
testato qui sembra sorta lavoro per me. cosa stai cercando di realizzare? – xenoterracide
si suppone che apra il terminale e stampi Hello World nel terminale? – xenoterracide
o stai solo provando a fare una chiamata asincrona per aprire il terminale? – xenoterracide