当来自 Perl 的 运行 命令时,分段错误消失
Segmentation fault disappears when running command from Perl
我有一个引发 SIGSEGV 的简单 C++ 程序:
#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_status\n";
我在 运行 运行脚本时得到以下输出:
Raising seg fault...
exit status: 0
这怎么可能? segmentation fault在哪里,为什么退出状态为0?
您特意忽略了 $?
中指示进程是否被信号杀死的部分。
替换
my $exit_status = $?>>8;
print "exit status: $exit_status\n";
与
die("Killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("Exited with error ".( $? >> 8 )."\n") if $? >> 8;
print("Completed successfully\n");
我有一个引发 SIGSEGV 的简单 C++ 程序:
#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_status\n";
我在 运行 运行脚本时得到以下输出:
Raising seg fault...
exit status: 0
这怎么可能? segmentation fault在哪里,为什么退出状态为0?
您特意忽略了 $?
中指示进程是否被信号杀死的部分。
替换
my $exit_status = $?>>8;
print "exit status: $exit_status\n";
与
die("Killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("Exited with error ".( $? >> 8 )."\n") if $? >> 8;
print("Completed successfully\n");