我正在为学生项目编写类似bash的shell。
我需要制作一个perl
自动测试线命令。
my $cmd = "(echo \"foo\" | ./shell >& /dev/null)";
system($cmd);
if ($? == 35584) {
print "SIGSEGV";
}
elsif ($? == 34304) {
print "GLIB C";
}
else {
print "GOOD";
}
我希望能够隐藏segfault
或glibc
上的输出。
@Marc B. 好的,但我的shell读取输出0,所以我必须有“echo”:s
@drquicksilver 检测到 * glibc ./shell:free():指针无效:0x0000000000608291 * * 要么 分段错误
答案 0 :(得分:1)
首先,system
执行sh
,但您使用csh
语法。
my $cmd = "(echo \"foo\" | ./shell >& /dev/null)";
应该是
my $cmd = "(echo \"foo\" | ./shell >/dev/null 2>&1)";
但执行shell只会干扰您的测试。所以让我们完全避开shell。
use Config qw( %Config );
use IPC::Run qw( run );
sub sig_name {
my ($sig_num) = @_;
my %sig_names;
@sig_names{ reverse split ' ', $Config{sig_num} } =
reverse split ' ', $Config{sig_name};
return $sig_names{$sig_num}
? "SIG$sig_names{$sig_num} (".($sig_num).")"
: $sig_num;
}
run [ './shell' ], \"foo\n", '>','/dev/null', '2>&1';
if (my $sig_num = $? & 0x7F) {
print "Killed by signal ".sig_name($sig_num)."\n";
} elsif (my $exit_code = $? >> 8) {
print "Exited with error code $exit_code\n";
} else {
print "GOOD\n";
}
你所谓的“GLIB C”实际上是SIGABRT。