处理信号.Perl的

sli*_*ddy 1 perl signals

我怎么能写一个处理这种信号的程序?

  • SIGUSR1 - 打印统计信息(就像dd实用程序一样);
  • SIGUSR2 - 打印可用内存量;
  • SIGINT - 将USR1发送给自己并退出程序.

这就是我得到的,没有输出:

$| = 1;
kill 'USR1';
kill 'USR2';

$SIG{USR1} = {print `dd if=/def/zero of=/dev/null bs=512`};
$SIG{USR2} = {print `free -m`};
$SIG{INT} = { kill 'USR1' => $$; die};
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 6

  1. 您没有指定要向哪个程序发送信号.
  2. 您在设置处理程序之前发送了信号!
  3. 你错过了" sub".

use strict;
use warnings;

$| = 1;

$SIG{USR1} = sub { print `dd if=/def/zero of=/dev/null bs=512`; };
$SIG{USR2} = sub { print `free -m`; };
$SIG{INT}  = sub { kill USR1 => $$; die "Interrupt"; };

kill USR1 => $$;
kill USR2 => $$;
Run Code Online (Sandbox Code Playgroud)

也,

  1. print `...`是一种愚蠢的写作方式system('...').
  2. 不要发送信号来调用函数!

use strict;
use warnings;

$| = 1;

sub job1 { system('dd if=/def/zero of=/dev/null bs=512'); }
sub job2 { system('free -m'); }

$SIG{USR1} = \&job1;
$SIG{USR2} = \&job2;
$SIG{INT}  = sub { job1(); die "Interrupt"; };

kill USR1 => $$;
kill USR2 => $$;
Run Code Online (Sandbox Code Playgroud)