Re: sigtrap disabled after DBI->connect

[email protected] (Martin Evans)
Newsgroups perl.dbi.users
Organization Easysoft Limited
Message-ID <[email protected]>
Steve Lynn wrote:
> On Mar 2, 2:30 am, [email protected] (Martin Evans) wrote:
>> Lynn, Steve wrote:
>>> All - I'm under Solaris using perl v. 5.8.3 and DBI v. 1.48.  I can catch signals w/o a problem before I connect to the database.
>>> However after I connect, I can't catch signals anymore.  If I comment out the "DBI->connect" and press ctrl-c in a ReadLine(0), the signal is caught fine.
>>> I found one other issue that seemed similar (http://www.mail-archive.com/[email protected]/msg07747.html).
>>> Please help.
>>> ###########################
>>> #!/usr/local/perl -w
>>> use strict;
>>> use warnings;
>>> use Term:ReadKey;
>>> require DBI;
>>> use sigtrap 'handler', \&SigExit, qw/HUP INT KILL/;
>>> my $dbh;
>>> my $response;
>>> sub SigExit {
>>>     print STDOUT "\nTest\n";
>>>     die("\n");
>>> }
>>> $dbh = DBI->connect("DBI:Oracle:host=dbserver;sid=mydb;port=1521","scott","tiger")­;
>>> print "\nEnter a response: ";
>>> $response = ReadLine(0);
>>> print ""\nEnter another response: ";
>>> $response = ReadLine(0);
>>> ###########################
>>> Thanks,
>>> Steve
>> Oracle client libraries can trap some signals (including HUP) depending
>> on which ones you use and how you are connecting. I believe you will
>> need to set up your handlers after connect for those signals but I
>> cannot remember the down side in Oracle.
>>
>> There have been various posts on dbi-users about this in the past so an
>> archive of dbi-users (some can be found at dbi.perl.org) would probably
>> list them.
>>
>> Martin
>> --
>> Martin J. Evans
>> Easysoft Limitedhttp://www.easysoft.com- Hide quoted text -
>>
>> - Show quoted text -
> 
> Thanks Martin.
> 
> I'm not sure whether I was clear enough on my goal.  I'm trying to
> trap INT signals so that when requesting input from the operator with
> ReadLine, they can press ctrl-c and exit.  I don't like the default
> signal handling so I'd like to just do a die("\n") when an INT is
> received.

I think I got that.

> When I comment out the DBI->connect, a ctrl-c will exit from the
> ReadLine as intended.  However, once the DBI->connect is completed,
> and the operator presses ctrl-c within the ReadLine, '^C' appears, but
> the signal handler isn't called.  It looks like the DBI->connect
> cancels, disables or overrides my sigtrap.

What I saying is that the Oracle client libraries sometimes add signal
handlers (especially SIGCHLD) and these would be setup when you connected.

> I'm not trying to handle any signals from within DBI.  I just trying
> to handle INT from within ReadLine.  It seems like DBI->connect is
> canceling my signal handler.
> 
> I tried to reload sigtrap immediately after the DBI->connect but that
> didn't work either:

Then I think you have a different issue to the one I thought you had but
I suggest you write a script with a simple connect in it and nothing
else then run truss on it to see what actions are performed on signals.

When I do this (on Linux with instant client 11) I see:

rt_sigaction(SIGQUIT, NULL, NULL, 8)    = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGILL, NULL, NULL, 8)     = 0
rt_sigaction(SIGILL, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGILL, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGABRT, NULL, NULL, 8)    = 0
rt_sigaction(SIGABRT, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGABRT, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGFPE, NULL, NULL, 8)     = 0
rt_sigaction(SIGFPE, NULL, {0x1, [FPE], SA_RESTART}, 8) = 0
rt_sigaction(SIGSEGV, NULL, NULL, 8)    = 0
rt_sigaction(SIGSEGV, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSEGV, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGBUS, NULL, NULL, 8)     = 0
rt_sigaction(SIGBUS, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGBUS, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, NULL, NULL, 8)     = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTRAP, NULL, NULL, 8)    = 0
rt_sigaction(SIGTRAP, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGTRAP, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXCPU, NULL, NULL, 8)    = 0
rt_sigaction(SIGXCPU, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXCPU, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXFSZ, NULL, NULL, 8)    = 0
rt_sigaction(SIGXFSZ, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGXFSZ, {0x221fb9e, [], SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0

and later

rt_sigaction(SIGPIPE, {0x1, ~[ILL ABRT BUS FPE SEGV USR2 XCPU XFSZ SYS
RTMIN RT_1], SA_RESTART|SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0

rt_sigaction(SIGTSTP, {0x1, ~[ILL ABRT BUS FPE SEGV USR2 XCPU XFSZ SYS
RTMIN RT_1], SA_RESTART|SA_SIGINFO}, {SIG_DFL, [], 0}, 8) = 0

> #!/usr/local/perl -w
> 
> use strict;
> use warnings;
> use Term:ReadKey;
> require DBI;
> 
> use sigtrap 'handler', \&SigExit, qw/HUP INT KILL/;
> 
> my $dbh;
> my $response;
> 
> sub SigExit {
>     print STDOUT "\nTest\n";
>     die("\n");
> }
> 
> $dbh = DBI-
>> connect("DBI:Oracle:host=dbserver;sid=mydb;port=1521","scott","tiger")­;
> 
> use sigtrap 'handler', \&SigExit, qw/HUP INT KILL/;
> 
> print "\nEnter a response: ";
> $response = ReadLine(0);
> 
> print ""\nEnter another response: ";
> $response = ReadLine(0);
> 
> ##################################
> 
> Any help would be appreciated,
> 
> Steve Lynn
> 
> 

BTW, your example works fine for me on Linux with Oracle Instant Client
11 (even without the second sigtrap).

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.