代码之家  ›  专栏  ›  技术社区  ›  dlamotte

为什么SIGINT不在这里被抓?

  •  7
  • dlamotte  · 技术社区  · 14 年前

    这是怎么回事?我以为SIGINT会被送到前台进程组。

    (我想,也许system()正在运行一个shell,它正在为子进程创建一个新的进程组?有人能证实这一点吗?)

    % perl
    local $SIG{INT} = sub { print "caught signal\n"; };
    system('sleep', '10');
    

    然后点击ctrl+d,然后点击ctrl+c,注意“捕获信号”永远不会被打印出来。

    我觉得这很简单。。。不管怎样,你想解决这个问题吗?问题是,当通过系统运行一系列命令时,会导致按住ctrl+c直到所有迭代都完成(因为perl永远不会得到SIGINT),这相当烦人。。。

    如何解决这个问题(我已经直接使用fork()进行了测试,并且明白这是可行的。。。目前这不是一个可接受的解决方案)

    更新 :请注意,这是 没有什么

    2 回复  |  直到 14 年前
        1
  •  4
  •   Hasturkun    14 年前

    perldoc system

    由于在系统执行过程中忽略了SIGINT和SIGQUIT,

    @args = ("command", "arg1", "arg2");
    system(@args) == 0
       or die "system @args failed: $?"
    

    如果您想手动检查系统的故障,您可以检查所有可能的故障

    if ($? == -1) {
        print "failed to execute: $!\n";
    }
    elsif ($? & 127) {
        printf "child died with signal %d, %s coredump\n",
           ($? & 127),  ($? & 128) ? 'with' : 'without';
    }
    else {
        printf "child exited with value %d\n", $? >> 8;
    }
    

    或者,您可以使用来自POSIX模块的W*()调用检查${^CHILD\u ERROR\u NATIVE}的值

        2
  •  0
  •   Ether    14 年前

    我不太明白你想达到什么目的。。。但你有没有试过简单的比较一下:

    perl -wle'local $SIG{INT} = sub { print "caught signal"; }; sleep 10;'