我正在编写一个curses脚本,它需要在处理SIGINT后进行清理,以便将终端恢复到原始状态.
启用信号处理程序时,我得到一个段错误.
码:
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
sub cleanup { exit 0; }
sub run { while (1) {} }
# comment this line and the problem disappears
$SIG{INT} = \&cleanup;
foreach my $i (1..100) {
print "Creating this thread\n";
my $t = threads->create(\&run);
print "Created that thread\n";
}
while (1) { print "Looping\n"; }
示例错误跟踪(90%的时间段为segfaults):
$./threadtest.perl
...
Creating this thread
Creating that thread
Detaching this thread
Detaching that thread
Creating this thread
^CSegmentation fault
$
眼镜:
>线程1.72
> archname“”
> os“”
> Perl 5.10.1(Debian附带)Debian
> 6挤压
初步印象:
我认为当自定义信号处理程序获取控制权时会出现问题.这会以某种方式阻止创建下一个线程,从而导致段错误.
Perl的默认SIGINT处理程序是否运行特殊代码以安全地结束线程创建的评估?如果是这样,我想解决方案是将copypasta引入自定义处理程序.
最佳答案
revision history for the
threads
module包含:
1.73 Mon Jun 8 13:17:04 2009
- Signal handling during thread creation/destruction (John Wright)
- Upgraded ppport.h to Devel::PPPort 3.17
这表明在早于1.73的版本中,在创建和销毁线程期间存在已知的信号处理问题.升级您的线程模块.