Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Perl Term :: ReadLine :: Gnu信号处理的难点大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Term :: ReadLine :: Gnu并遇到了信号处理问题.鉴于下面的脚本和发送到脚本的TERM信号,在按下回车键之前,不会触发TERM信号的处理程序.使用Term :: ReadLine:Perl不会发生这种情况.

我已经读过Term :: ReadLine :: Gnu有自己的内部信号处理程序,但坦率地说,我不知道如何使用它们.

我已经审查过http://search.cpan.org/~hayashi/Term-ReadLine-Gnu-1.20/Gnu.pm#Term::ReadLine::Gnu_Variables尝试将rl_catch_signals变量设置为0,但这没有帮助.理想情况下,我想与Gnu信号处理程序一起工作,但我也会满足于禁用它们.

为了绝对具体,我需要TERM处理程序在接收到信号后触发,而不是等待按下回车键.

任何帮助或建议当然感谢!

#!/usr/bin/perl

use Strict;
use warnings;
use Term::readLine;

$SIG{TERM} = sub { print "I got a TERM\n"; exit; };

my $term = Term::readLine->new('Term1');
$term->ornaments(0);
my $prompt = 'cmd> ';
while ( defined (my $cmd = $term->readline($prompt)) ) {
    $term->addhistory($cmd) if $cmd !~ /\S||\n/;
    chomp($cmd);
    if ($cmd =~ /^Help$/) {
        print "Help Menu\n";
    }
    else {
        print "Nothing\n";
    }
}

解决方法

这是由于perl默认的偏执处理信号 – 在幕后,perl在启动readline调用之前阻塞SIGTERM并在完成后恢复它.有关详细信息,请参阅 Deferred Signals in perlipc.

Term :: ReadLine :: Perl使用perl的IO,它知道这些问题并处理它们,所以你没有看到它的错误. Term :: ReadLine :: Gnu使用C库,但没有,所以你这样做.

您可以使用以下两种方法之一解决此问题:

>在运行脚本之前将环境变量PERL_SIGNALS设置为unsafe,如:

bash$PERL_SIGNALS=unsafe perl readline-test.pl

注意,BEGIN {$ENV {PERL_SIGNALS} =“不安全”;还不够,它需要在perl本身启动之前设置.
>使用POSIX信号功能:

#~ $SIG{TERM} = sub { print "I got a TERM\n"; exit; };
use POSIX;
sigaction SIGTERM,new POSIX::SigAction sub { print "I got a TERM\n"; exit; };

以上两者似乎都适用于Linux;不能代表Windows或其他unices.此外,上述两种情况都存在风险 – 详见perlipc.

大佬总结

以上是大佬教程为你收集整理的Perl Term :: ReadLine :: Gnu信号处理的难点全部内容,希望文章能够帮你解决Perl Term :: ReadLine :: Gnu信号处理的难点所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。