windows - 在 Windows 上捕获 SIGINT(和其他信号)

标签 windows perl signals

为什么使用这个简单的脚本:

#! perl -w

use strict;
use warnings;
$| = 1;

my $LOCKFILE = "$0.lock";

sub mklock {
    open my $lf, ">", $LOCKFILE;
    print $lf $$;
    close $lf;
}

sub rmlock { unlink $LOCKFILE; }

sub clean_exit { rmlock;  exit 0; }

sub work {
    print "working...";
    sleep 10;
    # although `sleep 1 foreach (1..10);`
    # *does* interrupt---between `sleep`s--see my answer
    print "done.\n"
}

$SIG{INT} = "clean_exit";

mklock;
work;
rmlock;

可以在 Debian 上运行但不能在 Windows 上运行?

  • 在 Windows 上,当此脚本运行时,Ctrl+C 将被忽略
  • 在 Debian 上,按预期执行干净退出
  • 使用 $SIG{INT} =\&clean_exit;,行为似乎相同
  • (如果我对 SIGHUP ($SIG{HUP} = "clean_exit";) 执行相同的操作,窗口将关闭但不会执行干净退出)

(好吧,我承认它是为 Windows 7 amd64 -vs- 上的 MSWin32-x86-multi-thread 构建的 Strawberry perl 5,版本 14,subversion 2 (v5.14.2) perl,v5.10.1 (*) 为 x86_64-linux-gnu-thread-multi 在 Debian 6.0.4 机器上构建,但我怀疑它对这些基本的东西是否重要。编辑:我刚刚用 ActiveState perl 5.12 在类似的盒子上检查了它,它是一样的,所以显然这个问题并不孤立于 Strawberry。)

我知道perlport说的很清楚,

Don't count on signals or %SIG for anything.

但必须有办法......(另外,我想明白。)

那么应该采取哪些不同的做法呢?

最佳答案

您可以使用 sigtrap用法:

use sigtrap 'handler', \&cleanup, 'normal-signals';

当捕获到信号并将信号标识作为参数传递时,这将调用方法 cleanup

关于windows - 在 Windows 上捕获 SIGINT(和其他信号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912113/

相关文章:

c++ - 如果一个程序是由 system() 或 CreateProcess() 从另一个程序启动的,如何防止 Ctrl+Break/Ctrl+C 关闭这两个程序?

windows - IIS 使用 powershell 禁用 ocsp 装订

c - 如何创建一个线程来处理信号并在收到信号后退出进程?

c++ - 如何将 'on double clicked' 事件添加到 QTableWidget 中的整行?

c - 暂停进程时的底层机制

c# - 如何为表单中的每个 WebBrowser 控件设置不同的代理 - 所有可能的方法

c++ - 在 Windows 上制作一个带有拉丁字符 (Á ,ò ,ã ) 的简单程序

php - 无限循环

Perl:子声明的 arg 列表中的 ;\$ 是什么意思?

regex - 何时使用相等运算符而不是绑定(bind)运算符