Blame


1 ffd9a51f 2023-08-04 jrmu #!/usr/bin/perl
2 ffd9a51f 2023-08-04 jrmu
3 ffd9a51f 2023-08-04 jrmu # (Unix only) Write an infinite loop program that catches signals
4 ffd9a51f 2023-08-04 jrmu # and reports which signal it caught and how many times it has seen
5 ffd9a51f 2023-08-04 jrmu # that signal before. Exit if you catch the INT signal. If you can
6 ffd9a51f 2023-08-04 jrmu # use the command-line kill, you can send signals like so:
7 ffd9a51f 2023-08-04 jrmu #
8 ffd9a51f 2023-08-04 jrmu # $ kill -USR1 12345
9 ffd9a51f 2023-08-04 jrmu #
10 ffd9a51f 2023-08-04 jrmu # If you can't use the command-line kill, write another program to
11 ffd9a51f 2023-08-04 jrmu # send signals to it. You might be able to get away with a Perl
12 ffd9a51f 2023-08-04 jrmu # one-liner:
13 ffd9a51f 2023-08-04 jrmu #
14 ffd9a51f 2023-08-04 jrmu # $ perl -e 'kill HUP = 12345'>
15 ffd9a51f 2023-08-04 jrmu
16 ffd9a51f 2023-08-04 jrmu use v5.24;
17 ffd9a51f 2023-08-04 jrmu use warnings;
18 ffd9a51f 2023-08-04 jrmu use strict;
19 ffd9a51f 2023-08-04 jrmu use utf8;
20 ffd9a51f 2023-08-04 jrmu
21 ffd9a51f 2023-08-04 jrmu foreach (qw (int hup usr1 usr2)) {
22 ffd9a51f 2023-08-04 jrmu my $sig = uc $_;
23 ffd9a51f 2023-08-04 jrmu $SIG{$sig} = sub {
24 ffd9a51f 2023-08-04 jrmu my $signal = $sig;
25 ffd9a51f 2023-08-04 jrmu state $n;
26 ffd9a51f 2023-08-04 jrmu printf("%s: %d\n", $signal, ++$n);
27 ffd9a51f 2023-08-04 jrmu if ($signal eq 'INT') {
28 ffd9a51f 2023-08-04 jrmu die;
29 ffd9a51f 2023-08-04 jrmu }
30 ffd9a51f 2023-08-04 jrmu };
31 ffd9a51f 2023-08-04 jrmu }
32 ffd9a51f 2023-08-04 jrmu while (1) {
33 ffd9a51f 2023-08-04 jrmu
34 ffd9a51f 2023-08-04 jrmu }