首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统子程序和INT信号问题

系统子程序和INT信号问题
EN

Stack Overflow用户
提问于 2011-04-27 23:25:01
回答 2查看 1.8K关注 0票数 2

我的Perl脚本中有一个INT信号处理程序。当发送INT时,当Perl脚本处于系统调用过程中时,它将不会被执行。为什么?

考虑一下:

代码语言:javascript
复制
$ perl5.12/bin/perl -E "$(cat <<EOF

    \$SIG{INT} = sub {say q(trapped INT); exit};
    say q(sleeping ...);
    system q(sleep 10000); # INT at this point is not caught by Perl.

EOF)"
sleeping ...

但是,如果我将系统调用替换为睡眠调用,它将按预期工作:

代码语言:javascript
复制
$ perl5.12/bin/perl -E "$(cat <<EOF

    \$SIG{INT} = sub {say q(trapped INT); exit};
    say q(sleeping ...);
    sleep 10000; # replaces the system call from above

EOF)"
sleeping ...
trapped INT

Perl版本为:

代码语言:javascript
复制
$ perl5.12/bin/perl -v

This is perl 5, version 12, subversion 3 (v5.12.3) built for x86_64-linux-thread-multi
(with 9 registered patches, see perl -V for more detail)

Copyright 1987-2010, Larry Wall

Binary build 1204 [294330] provided by ActiveState http://www.ActiveState.com
Built Feb  9 2011 14:48:47
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 23:38:43

您可以通过检查SIGINT来检测system()子进程是否被$?杀死,如下所示:

代码语言:javascript
复制
use POSIX qw(SIGINT);

sub interrupt {
    say "trapped INT";
    exit;
}

$SIG{INT} = \&interrupt;

say "sleeping";
system ("sleep 100");

if (($? & 127) == SIGINT) {
        interrupt();
} elsif ($?) {
        say "subprocess failed, status $?";
}

当外部命令正在运行时,perl会忽略INTQUIT信号,请参见system()

票数 6
EN

Stack Overflow用户

发布于 2011-04-27 23:42:32

当调用system()时,正在执行的任何东西都拥有对终端的控制权。通过键盘控制向它发送任何信号都将被发送到正在执行的进程(在本例中是系统的睡眠命令)。

捕获信号并在Perl脚本中对其执行某些操作仅在该脚本运行时有效。要在Bash中设置陷阱,可以使用trap "command" signal

代码语言:javascript
复制
$ perl -e'system("trap \"echo Trapped\" SIGINT; sleep 10");'
^CTrapped
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5806555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档