#!/usr/bin/perl
use POSIX ":sys_wait_h";
$SIG{CHLD} = \&REAPER;
sub REAPER {
my $pid;
while (($pid = waitpid(-1, WNOHANG)) > 0) {
print "where is here,$pid\n";
}
}
sub child {
print "I'm child, pid=$$.\n";
sleep 2;
}
$lid = fork();
if ($lid == 0) {
&child;
exit;
} else {
sleep 1000;
print "I am parent, child pid : $lid\n";
}
Sortie:sommeil Perl terminé par SIGCHLD
I'm child, pid=11839.
where is here,11839
I am parent, child pid : 11839
Ce qui précède est mon script Perl. La sortie est bonne, mais une chose étrange est qu'il imprime I am parent, child pid : 11839
immédiatement après la dernière sortie. Pourquoi le sleep 1000
n'a-t-il aucun effet?
Ce n'est pas ainsi que 'sleep' est implémenté, dans la plupart des OS/Perls de cette décennie, ou dans le noyau. Voir https://linux.die.net/man/3/usleep –
@ZacB: Je regarde la source C de Perl v5.24 et votre commentaire semble injuste. S'il vous plaît ajouter une réponse qui définit correctement comment un appel Perl 'sommeil' fonctionne dans vos yeux. Notez qu'il n'appelle pas 'usleep' que vous avez lié. – Borodin
@ZacB Alors, comment est-il mis en œuvre? Je voudrais savoir, si ce n'est pas comme ça. Le lien que vous fournissez est juste la page de manuel de 'usleep', ce qui ne me dit rien sur la façon dont Perl implémente le sien. La page de Perl pour [sleep] (http://perldoc.perl.org/functions/sleep.html) fait en fait allusion à 'setitimer'. Notez que 'usleep' _à partir d'un module_ qui est mentionné ne semble pas utiliser _ syscall (voir les documents du module). Pouvez-vous fournir des documents ou des pointeurs? – zdim