从Perl运行命令时,分段错误消失

Mor*_*rad 2 perl exit-code segmentation-fault child-process

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

#include <iostream>
#include <signal.h>

int main() {
    std::cout << "Raising seg fault..." << std::endl;
    raise(SIGSEGV);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行此程序时,我得到以下输出

Raising seg fault...
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

但是当我使用管道在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_status\n";
Run Code Online (Sandbox Code Playgroud)

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

Raising seg fault...
exit status: 0
Run Code Online (Sandbox Code Playgroud)

怎么可能这样呢?分段错误在哪里?为什么退出状态为0?

ike*_*ami 5

您特别忽略了部分$?,表明该过程是否被信号杀死.

更换

my $exit_status = $?>>8;
print "exit status: $exit_status\n";
Run Code Online (Sandbox Code Playgroud)

die("Killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("Exited with error ".( $? >> 8 )."\n") if $? >> 8;
print("Completed successfully\n");
Run Code Online (Sandbox Code Playgroud)

  • 因为该消息是由shell生成的 (4认同)