#!/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(hesitent直接这样做,因为这是一台生产机器)。
答案 0 :(得分:1)
返回值-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;
}
答案 1 :(得分:0)
我意识到这个帖子已经过了几个月,但由于我遇到了同样的问题,我会详细介绍我的解决方法,让任何偶然发现你的帖子。
不同版本的Oracle OCI库分别处理SIGCHILD(例如,我有11gR2而不是11gR1的问题)。如果您通过更改
避免使用遗留连接DBI-> connect('dbi:Oracle:','pwd','pwd');
到
DBI-> connect('dbi:Oracle:','pwd','pwd');
你会发现你的问题消失了。当然,您可能不希望通过听众进行连接,但我没有解决方案......