Handling two signal handler

Discussion in 'Perl Misc' started by sanjeeb, Nov 19, 2009.

  1. sanjeeb

    sanjeeb Guest

    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???
     
    sanjeeb, Nov 19, 2009
    #1
    1. Advertising

  2. sanjeeb <> 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 ___
    \__________________________ http://toerring.de
     
    Jens Thoms Toerring, Nov 19, 2009
    #2
    1. Advertising

  3. sanjeeb

    sanjeeb Guest

    On Nov 19, 10:24 pm, (Jens Thoms Toerring) wrote:
    > sanjeeb <> 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  ___      
    >    \__________________________      http://toerring.de


    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.
     
    sanjeeb, Nov 20, 2009
    #3
  4. 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
     
    Martijn Lievaart, Nov 20, 2009
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Michael Pronath
    Replies:
    1
    Views:
    1,242
    Diez B. Roggisch
    Jan 3, 2005
  2. Jack Orenstein

    threading.Thread vs. signal.signal

    Jack Orenstein, Sep 18, 2005, in forum: Python
    Replies:
    0
    Views:
    504
    Jack Orenstein
    Sep 18, 2005
  3. Weng Tianxiang
    Replies:
    2
    Views:
    690
    Jonathan Bromley
    Jan 30, 2007
  4. Nicolas Moreau
    Replies:
    9
    Views:
    3,369
  5. Peter
    Replies:
    34
    Views:
    2,020
    James Kanze
    Oct 17, 2009
Loading...

Share This Page