(contribution de brian d foy)
Il n'y a pas une seule façon d'exécuter du code en arrière-plan afin que vous ne devez pas attendre pour qu'il se termine avant que votre programme passe à d'autres tâches. La gestion des processus dépend de votre système d'exploitation particulier, et de nombreuses techniques sont en perlipc.
Plusieurs modules peuvent être CPAN en mesure d'aider, y compris IPC::Open2 ou IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, Proc::Background et Win32::Process. Il existe de nombreux autres modules que vous pouvez utiliser, donc vérifiez ces espaces de noms pour d'autres options aussi.
Si vous êtes sur un système de type Unix, vous pourriez être en mesure de sortir avec un appel système où vous mettez un & à la fin de la commande:
system("cmd &")
Vous pouvez également essayer d'utiliser la fourchette , comme décrit dans perlfunc (bien que ce soit la même chose que beaucoup de modules feront pour vous).
STDIN, STDOUT et STDERR sont partagés
Le processus principal et celui backgrounded (le processus "enfant") partagent les mêmes STDIN, STDOUT et STDERR handles de fichiers. Si les deux essayent d'y accéder à la fois, des choses étranges peuvent arriver. Vous voudrez peut-être les fermer ou les rouvrir pour l'enfant. Vous pouvez contourner cela en ouvrant un pipe (voir open in perlfunc) mais sur certains systèmes cela signifie que le processus fils ne peut pas survivre au parent. Signaux Vous devrez attraper le signal SIGCHLD, et éventuellement SIGPIPE. SIGCHLD est envoyé lorsque le processus en arrière-plan se termine. SIGPIPE est envoyé lorsque vous écrivez à un descripteur de fichier dont le processus enfant a été fermé (un SIGPIPE non enfiché peut entraîner la mort de votre programme). Ce n'est pas un problème avec le système ("cmd &").
Zombies
Vous devez être prêt à « récolter » le processus de l'enfant quand il se termine.
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
Vous pouvez également utiliser une double fourche. Vous attendez immédiatement() pour votre premier enfant, et le démon init attendra() pour votre petit-fils une fois qu'il aura quitté.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
Voir signaux dans perlipc pour d'autres exemples de code pour le faire. Les zombies ne sont pas un problème avec le système ("prog &").
semble sorta travail pour moi. Qu'est-ce que vous essayez d'accomplir? – xenoterracide
est-il censé ouvrir le terminal et ensuite imprimer bonjour monde dans le terminal? – xenoterracide
ou essayez-vous d'effectuer un appel asynchrone pour ouvrir le terminal? – xenoterracide