从Perl运行命令时,分段故障消失



我有一个简单的c++程序,它会引发SIGSEGV:

#include <iostream>
#include <signal.h>
int main() {
std::cout << "Raising seg fault..." << std::endl;
raise(SIGSEGV);
return 0;
}

当运行这个程序时,我得到以下输出

Raising seg fault...
Segmentation fault

但是,当我使用管道在perl脚本中运行程序时,分段错误就会消失。这是我的Perl脚本:

use strict;
use warnings;

my $cmd ="./test";
open (OUTPUT, "$cmd 2>&1 |") || die();
while (<OUTPUT>) {
print;
}
close (OUTPUT);
my $exit_status = $?>>8;
print "exit status: $exit_statusn";

运行脚本时,我得到以下输出:

Raising seg fault...
exit status: 0

这怎么可能呢?分段故障在哪里?为什么退出状态为0?

您特别忽略了$?中指示进程是否被信号终止的部分。

更换

my $exit_status = $?>>8;
print "exit status: $exit_statusn";

带有

die("Killed by signal ".( $? & 0x7F )."n") if $? & 0x7F;
die("Exited with error ".( $? >> 8 )."n") if $? >> 8;
print("Completed successfullyn");

最新更新