出力の一時停止と再開
Posted feedbacks - Perl
fork ってみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | use strict;
use warnings;
use POSIX qw( SIGKILL SIGINT );
BEGIN { system 'stty -echo -icanon >/dev/tty' }
END{ system 'stty echo icanon >/dev/tty' }
my $pid = fork;
if($pid) {
for(;;){
my $a = getc;
if($a eq 'q') {
kill SIGKILL , $pid;
exit;
}
elsif($a eq 'p') {
kill SIGINT , $pid;
}
}
}
else {
my $flag = 1;
local $| = 1;
local $SIG{INT} = sub(){ $flag = !$flag };
for(;;){
print "a" if $flag;
sleep 1;
}
}
|
threadを使った
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | use strict;
use threads;
use threads::shared;
use Term::ReadKey;
$| = 1;
my $f : shared;
sub observe {
ReadMode 'cbreak';
while(1){
my $key;
while(1){ last if $key = ReadKey(0) }
{
lock $f;
if ($key eq 'q'){ ReadMode 'restore'; exit;}
if ($key eq 'p'){ $f == 1 ? $f-- : $f++;}
}
}
}
sub print_a {
while(1){
if($f == 1){
print "a";
sleep 1;
}
}
}
$f = 1;
my $ob = threads->create(\&observe);
my $pr = threads->create(\&print_a);
$ob->join;
$pr->join;
|



nobsun
#6346()
Rating3/3=1.00
起動すると、標準出力に1秒毎に'a'の1文字を出力し続けるプログラムで、 以下の条件を満たすものを「どう書く?」
[ reply ]