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