Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Handling two signal handler

1 view
Skip to first unread message

sanjeeb

unread,
Nov 19, 2009, 11:06:54 AM11/19/09
to
Hi,
I have a application which multiple modules. Each module do some task.
I have a signal handler defined in the main.pl which is the starting
point to run the application.
I want to define signal handler in each module which will do specific
task and again raised a signal which will be handled by the global
signal handler.
The signal to be caught are same throughout, not specific to any class
or the global handler.
Scenario :
application.pl define a a signal handler &globalhandler
application.pl creates a object out of foo.pm and foo.pm defines
a handle &foo_cleaner
when the execution is under the context of foo.pm object , a
INT signal caught. It will clean up the required things populated
by foo.pm and then raised the same signal from foo_cleaner. After
raising the &globalhandler should be called means the global handler
will be caught.
I tried but didnt succeded.

Do you have guys any idea whether there is some way out???
Can i get two handlers with the same signal???

Jens Thoms Toerring

unread,
Nov 19, 2009, 12:24:49 PM11/19/09
to
sanjeeb <sanj...@gmail.com> wrote:
> I have a application which multiple modules. Each module do some task.
> I have a signal handler defined in the main.pl which is the starting
> point to run the application.
> I want to define signal handler in each module which will do specific
> task and again raised a signal which will be handled by the global
> signal handler.
> The signal to be caught are same throughout, not specific to any class
> or the global handler.
> Scenario :
> application.pl define a a signal handler &globalhandler
> application.pl creates a object out of foo.pm and foo.pm defines
> a handle &foo_cleaner
> when the execution is under the context of foo.pm object , a

What do you mean with "the context of foo.pm object"?

> INT signal caught. It will clean up the required things populated
> by foo.pm and then raised the same signal from foo_cleaner. After
> raising the &globalhandler should be called means the global handler
> will be caught.
> I tried but didnt succeded.

> Do you have guys any idea whether there is some way out???
> Can i get two handlers with the same signal???

You can have only a single signal handler for each signal. So
if the signal has been dealt with by foo_cleaner() then it's
used up. Raising it again would only lead to foo_cleaner() being
called again as long as it's still installed as the handler for
that signal.

What you can do is to simply call global_handler() from
foo_cleaner(). You can figure out its address by inspecting
the value of $SIG{INT} before you install foo_cleaner() as
the new signal handler. I.e. do

my $old_handler = $SIG{ INT };
$SIG{ INT } = \&new_handler;

sub new_handler {
do_something;
&$old_handler( @_ );
}
Regards, Jens
--
\ Jens Thoms Toerring ___ j...@toerring.de
\__________________________ http://toerring.de

sanjeeb

unread,
Nov 20, 2009, 1:10:31 AM11/20/09
to
On Nov 19, 10:24 pm, j...@toerring.de (Jens Thoms Toerring) wrote:

Thanks.
I tried this before but it is not working in a threaded environment.
In context means , the object is created in a thread, but the signal
handler is installed at the
main application. Here is the flow.
./main.pl creates a thread -> object of Execution.pm is created in the
thread -> The signal handler should be installed in this context when
the thread created the object of Execution.pm.

i am hunting for the solution, let me know if you found anything,
thanks.

Martijn Lievaart

unread,
Nov 20, 2009, 3:09:31 AM11/20/09
to
On Thu, 19 Nov 2009 22:10:31 -0800, sanjeeb wrote:

> I tried this before but it is not working in a threaded environment. In
> context means , the object is created in a thread, but the signal
> handler is installed at the
> main application. Here is the flow.
> ./main.pl creates a thread -> object of Execution.pm is created in the
> thread -> The signal handler should be installed in this context when
> the thread created the object of Execution.pm.
>
> i am hunting for the solution, let me know if you found anything,
> thanks.

Threads and signals don't mix, as noted in the threads documentation.
This makes Perl threads absolutely useless in my opinion. Try a fork
based solution instead.

M4

0 new messages