为什么我的线程Perl脚本段错误?

我正在写一个curses脚本,需要在处理SIGINT后进行清理,才能使terminal恢复到原来的状态。

当信号处理程序启用时,我得到一个段错误。

为了支持,我删除了所有的诅咒代码来解决问题。

码:

#!/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%的时间):

 $ ./threadtest.perl ... Creating this thread Creating that thread Detaching this thread Detaching that thread Creating this thread ^CSegmentation fault $ 

眼镜:

  • 线程1.72
  • archname“”
  • 操作系统“”
  • Perl 5.10.1(附带Debian)Debian
  • 6挤压

最初的印象:

我认为问题发生在自定义信号处理程序抓取控制。 这以某种方式防止下一个线程被创build,导致段错误。

Perl的默认SIGINT处理程序是否运行特殊代码来安全地结束对线程创build的评估? 如果是这样,我想解决scheme是复制到自定义处理程序。

threads模块的修订历史记录包含:

 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版本之前的线程创建和销毁过程中存在一个已知的信号处理问题。 升级你的threads模块。