2012-05-17 6 views
-1

Je veux faire ce qui suit -casser « sommeil » en perl brusquement

#starting code 

sleep(1000); 

#remaining code 

Le code de départ serait courir et se retrouver coincé au « sommeil ». Après un certain temps (< < 1000), un autre processus réveillait ce processus en interrompant ce sommeil (probablement en envoyant un signal) et le reste du programme s'exécutait.

Je dois utiliser perl 5.6.1 sur Windows, et il ne supporte pas l'alarme. J'ai essayé quelques signaux comme SIGINT, SIGFPE etc. mais j'ai échoué. S'il vous plaît suggérer une alternative.

+2

Deux choses: 1. Mettez à niveau votre version de Perl. 2. Utilisez des fils. –

+0

@JackManey J'aurais sûrement fait ça mais il y a quelques contraintes. –

+1

[Il] (https://metacpan.org/module/App::perlbrew) [sont] (https://metacpan.org/module/local::lib) [alternatives] (http: //www.activestate .com/activeperl/téléchargements). –

Répondre

2

Utilisez-vous un gestionnaire de signal? Si ce n'est pas le cas, SIGINT et ses semblables mettront fin à votre programme.

my $parent_pid = $$; 

# schedule interruption 
if (fork() == 0) { 
    sleep 5; 
    kill 'INT', $parent_pid; 
    exit; 
} 

# trivial signal handler so SIGINT doesn't terminate the program 
$SIG{INT} = sub { }; 
my $n = sleep 1_000_000; 
print "Slept for $n seconds.\n"; 

Sur Linux, Perl 5.6.2, cela donne la sortie:

Slept for 5 seconds 

Pour cette question, je ne sais pas pourquoi vous dites alarme n'est pas pris en charge sur Perl 5.6 (sauf si vous êtes sur Windows peut-être?) Encore une fois, définissez un gestionnaire de signal ou votre programme se terminera.

$SIG{ALRM} = sub {}; 
alarm 5; 
$n = sleep 1_000_000; 
print "slept for $n seconds\n"; 

fonctionne très bien sur mon Perl 5.6.2.

+0

Il est sur Windows – ikegami

1

Eh bien, si je voulais imiter

$SIG{ALRM} = \&handle_alarm; 
alarm(5); 
... 
sleep(10); 

Je commencerais avec

use Time::HiRes qw(time sleep); # Optional 

my $alarm = time + 5; 
... 
my $timeout = $alarm - time; 
if ($timeout <= 0) { 
    handle_alarm(); 
} else { 
    my $to_sleep = 10; 
    $to_sleep = $timeout if $timeout < $to_sleep; 
    sleep($to_sleep); 
} 
+0

J'ai essayé exactement la même chose il y a quelques jours, ça a bien fonctionné dans la v5.14 mais pas dans la version v5.6. En tout cas merci. –

+0

@SiddharthGaur - "N'a pas fonctionné" n'est pas un message d'erreur intégré dans une version de Perl. –

+0

@Siddharth Gaur, Vous vous trompez sur l'exactitude de vos efforts. le 'time', l'addition et la soustraction fonctionnaient aussi bien dans 5.6 que dans 5.14. – ikegami