challenge 出力の一時停止と再開

起動すると、標準出力に1秒毎に'a'の1文字を出力し続けるプログラムで、 以下の条件を満たすものを「どう書く?」

  • 'q'キーが押されるとプログラムは終了する
  • 出力中に'p'キーが押されると一時停止する
  • 一時停止中に'p'キーが押されると出力を再開する

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;

Index

Feed

Other

Link

Pathtraq

loading...