Give signal handlers within an object access to $self by defining them with an anonymous subroutine. Updated: to reflect additional comments below about establishing per-object signal handlers.
sub set_signal_handlers { my $self=shift; $SIG{USR1}=sub { $self->handler_USR1() } ... } sub handler_USR1 { my $self=shift; # Now I can access the object through $self }
And call $object->set_signal_handlers() after creating the object (or $self->set_signal_handlers() from within the object itself).
As pointed out below, the above technique has the problem that signal handlers in Unix are per-process, so if more than one object sets a signal handler for the same signal using the technique above, only one of them will be executed. The following code solves this problem (slightly modified from code below, and combining my code with chromatic's) by using a single per-class signal handler, and a hash in which the specific per-object handlers are stored as code references. When the per-class handler is called, it calls all the per-object handlers in sequence. I wonder if this could be declared a belonging to class UNIVERSAL and then have every object in your program use it :-)
package Obj; # Class variable $handlers={}; sub new { my $class = shift; my $self = { @_ }; bless $self, $class; $self->set_signal_handlers; $self; } sub name { shift->{'name'}; } sub set_signal_handlers { my $self = shift; # Set handlers for USR1 if (!$handlers{USR1}) { # Class signal handler, only set the first time $SIG{USR1} = sub { class_handle_signal('USR1'); }; } # You could index by $self->name, or by any other identifier $handlers->{USR1}->{$self} = $self->handle_USR1(); # Set handlers for USR1 if (!$handlers{USR2}) { $SIG{USR2} = sub { class_handle_signal('USR2'); } } $handlers->{USR2}->{$self} = $self->handle_USR2(); } sub handle_USR1 { my $self = shift; return sub { print "handling USR1 for ", $self->name, "\n"; } } sub handle_USR2 { my $self = shift; return sub { print "handling USR2 for ", $self->name, "\n"; } } sub class_handle_signal { my $sig=shift; foreach (keys %{$handlers->{$sig}}) { &{$handlers->{$sig}->{$_}}(); } } package main; my $obj1 = new Obj(name => 'obj1'); my $obj2 = new Obj(name => 'obj2'); while (1) { }

In reply to Setting up signal handlers for an object with access to $self by ZZamboni

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.