为什么信号无法在Perl中的模块中捕获

时间:2018-03-28 08:59:57

标签: perl

我在主程序中设置了全局信号处理程序。 只有在sleep_funcmodule.pm完成后才能捕获信号。 当我按 Ctrl + C 时,信号处理程序在sleep_func中没有任何效果。

我希望这能像C程序一样工作。有谁知道我如何实现它?

我使用local $SIG{INT}=...,但这不起作用。

主程序:

use strict;
$SIG{INT}=sub {print "sigint caught in main"};
require "module.pm";
sleep_func();
sleep 10; 

module.pm:

use strict;

sub sleep_func {
    sleep 10;
}
1;

2 个答案:

答案 0 :(得分:3)

它不起作用的一个原因是因为你是suffering from buffering。 信号可能被捕获,信号处理程序可能正在运行,但是在程序结束之前你看不到输出,因为Perl正在缓冲输出。

一些修复

  • 将“\ n”附加到信号处理程序的输出中 - 默认情况下,Perl的标准输出是“行缓冲”,因此Perl会在看到换行符时刷新输出缓冲区

    $SIG{INT} = sub { print "sigint caught in main\n" };
    
  • 在脚本中设置$|=1 - 这可以在标准输出上启用自动清除

    $|=1; $SIG{INT} = sub { print "siging caught in main" };
    
  • 将输出写入标准错误而不是标准错误 - 默认情况下会自动刷新标准错误

    $SIG{INT} = sub { print STDERR "sigint caught in main" };
    

答案 1 :(得分:2)

请参阅Perl::Unsafe::Signals#DESCRIPTION

use Perl::Unsafe::Signals;
use strict;

sub sleep_func {
    UNSAFE_SIGNALS {
        sleep 10;
    }
}
1;

如果(不是)这会破坏,你就可以保留这些碎片。