
![]() | ![]() |
16.14. Sending a Signal
16.14.1. Problem
You want to send a signal to a
process. This could be sent to your own process or to another on the
same system. For instance, you caught SIGINT and
want to pass it on to your children.
16.14.2. Solution
Use kill to send a signal by name or number to the
process IDs listed in the remaining arguments:kill 9 => $pid; # send $pid a signal 9
kill -1 => $pgrp; # send whole job a signal 1
kill USR1 => $$; # send myself a SIGUSR1
kill HUP => @pids; # send a SIGHUP to processes in @pids
16.14.3. Discussion
Perl's kill function is an interface to the
syscall of the same name. The first argument is the signal to send,
identified by number or by name; subsequent arguments are process IDs
to send the signal to. It returns the count of processes successfully
signaled. You can only send signals to processes running under the
same real or saved UID as your real or effective UID—unless
you're the superuser.
If the signal number is negative, Perl
interprets remaining arguments as process group IDs and sends that
signal to all those groups' processes using the
killpg(2) syscall.A process group is essentially a job. It's how the operating system
ties related processes together. For example, when you use your shell
to pipe one command into another, you've started two processes, but
only one job. When you use Ctrl-C to interrupt the current job or
Ctrl-Z to suspend it, this sends the appropriate signals to the
entire job, which may be more than one process.kill can also check whether a process is alive.
Sending the special pseudo-signal number 0 checks whether it's legal
for you to send a signal to the process—without actually
sending one. If it returns true, the process is still alive. If it
returns false, the process either has changed its effective UID (in
which case $! will be set to EPERM) or no longer
exists (and $! is ESRCH). Zombie processes (as
described in Recipe 16.19) also report back as
ESRCH.use POSIX qw(:errno_h);
if (kill 0 => $minion) {
print "$minion is alive!\n";
} elsif ($! = = EPERM) { # changed uid
print "$minion has escaped my control!\n";
} elsif ($! = = ESRCH) {
print "$minion is deceased.\n"; # or zombied
} else {
warn "Odd; I couldn't check on the status of $minion: $!\n";
}
16.14.4. See Also
The "Signals" sections in Chapter 16 of Programming
Perl and in perlipc(1); your
system's sigaction(2),
signal(3), and kill(2)
manpages (if you have them); the kill function in
Chapter 29 of Programming Perl and
perlfunc(1)
![]() | ![]() | ![]() |
16.13. Listing Available Signals | ![]() | 16.15. Installing a Signal Handler |

Copyright © 2003 O'Reilly & Associates. All rights reserved.