DBD :: Oracle вызывает повреждение системных вызовов? - PullRequest
1 голос
/ 22 июля 2009

Видите какое-то странное поведение, когда подключаетесь к базе данных Oracle, а затем вызываете внешнюю функцию, значение $?всегда -1.
Проблема компьютера, на котором работает стандарт AIX5.3, с DBD :: Oracle 1.20 и DBI 1.602.

#!/usr/bin/perl -w
use DBI;

CORE::system "pwd";
print "Before connect: $?\n";
DBI->connect('dbi:Oracle:', 'pwd', 'pwd');
print "Before system: $?\n";
CORE::system "pwd";
print "After system: $?\n";
CORE::system "pwd";
print "After system: $?\n";

Before connect: 0
Before system: 0
/usr/local/bin
After system: -1
/usr/local/bin
After system: -1

Это результаты с другой машины AIX 5.3, единственное отличиеЯ вижу, что это работает DBD: Oracle 1.22 и DBI 1.607.Однако, просматривая журналы изменений для этих модулей, я не вижу ничего, что могло бы быть связано с этим.Любые идеи для дальнейших действий, которые я могу попробовать, кроме обновления DBD: Oracle и DBI (пока не решаюсь сделать это, поскольку это производственная машина).

Ответы [ 2 ]

1 голос
/ 22 июля 2009

из системы perldoc -f :

Возвращаемое значение -1 указывает на ошибку при запуске программы или ошибку системного вызова wait(2) (проверьте причину $!).

Похоже, что системный вызов не может exec программу pwd больше. Попробуйте изменить system звонки на:

my $rc = system "pwd";
if ($rc == -1) {
    die "system call failed: $!";
} elsif ($rc & 0b0000_0000_0111_1111) {
    die "system call died due to signal ", $rc & 0b0000_0000_0111_1111;
} elsif ($rc & 0b1111_1111_0000_0000) {
    warn "system call returned non-zero exit code: ", $rc >> 8;
}
0 голосов
/ 15 января 2010

Я понимаю, что это сообщение спустя несколько месяцев после факта, но, поскольку я столкнулся с той же проблемой, я подробно опишу обходной путь для всех, кто наткнулся на ваш пост.

Различные версии библиотек Oracle OCI обрабатывают SIGCHILD отдельно (например, у меня проблема с 11gR2, но не с 11gR1). Если вы избегаете использования соединений по завещанию путем изменения

DBI-> connect ('dbi: Oracle:', 'pwd', 'pwd');

до

DBI-> connect ('dbi: Oracle:', 'pwd', 'pwd');

вы обнаружите, что ваша проблема исчезнет. Конечно, вы можете не захотеть подключаться через прослушиватель, но у меня нет решения для этого ...

...