有关$SIG{INT}处理函数的问题

有关$SIG{INT}处理函数的问题

由于项目需要,脚本会有一些很长的执行外部命令的过程,这期间不希望被用的Ctrl+C中断,如果按了Ctrl+C,程序应该提示一个信息,如果用户确认中断,则程序在写入一个错误日志后退出。基本功能已经实现了,但是我看很多书上都写在信号处理函数里面,工作越简单越好,否则可能会导致程序崩溃,但我这里,则包含了输出信息,等待输入,写日志三部分,似乎潜在问题很多,不知道各位大侠有没有什么好的建议,如果修改比较好?

多谢了!
在INT里面设置一个标志,主要的操作留给主循环去处理。

例如:

[Copy to clipboard] [ - ]
CODE:
$int = 0;

$SIG{INT} = sub { $int = 1; }

while (1) {
  # 这里是主循环
  # 很耗时间的处理。。。。。一次又一次
  if ($int == 1) {
    $answer = ask_for_prompt("要退出吗?");
    if ($answer eq "要") {
      write_log("用户中断了");
      last;
    }
    else {
      # 继续执行。。。
      $int = 0;
    }
  }
}

这么写的话,如果用户在ask_for_prompt的时候又按了一次Ctrl+C,那程序不是就强行中断了么,就没有错误日志了阿~~

我看有的书里有下面这样的写法:

$SIG{INT} = \&INT_handler;
# main .....

sub INT_handler
{
    # processing INT
    $SIG{INT} = \&INT_handler;
}

不过我在win下面试好像不稳定,多按几次就莫名其妙的退出了~~ 这个问题有什么更好的解决办法么?
我忘了看过哪本书上很详细地讲解了这个问题的,想不起来了。
不是大骆驼,大骆驼上也说了一点,就是3楼说的方法,
那本书更为详细的。

用我的方法写了个测试代码,Ctrl-C之后仍然会block Ctrl-C的,不会强行中断啊。

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

$int = 0;
$SIG{INT} = sub { $int = 1; };

while (1) {
    print "Processing..\n";
    sleep 1;
    if ($int == 1) {
        print "Break? ";
        $_ = <>;
        chomp;
        if (/y/i) {
            exit;
        }
        else {
            $int = 0;
        }
    }
}

阿?? 为什么我这里就中断了?就是第一次按Ctrl +C后,出现break?的提示,这时候如果再按一次Ctrl+C就直接退出了阿~~ 我是Win32, ActivePerl。
sorry, 没注意到你是win32。
不过我这里win32下结果也差不多。第一次ctrl-c时出break?,再按系统就把Ctrl-C当作输入了,再出一个Process...,再出break?,这个样子:

Processing..
Processing..
Processing..
Break? Processing..
Break? Processing..
Break?
Processing..

倒是按Ctrl-Break能够中断,不过这时的信号是SIGBREAK,在perl里面监视SIGBREAK应该就行了。
不知道你那儿按两次^C时什么现象?
你的还能中断
我的有个接受socket的按下ctrl-c后要等很长时间才有响应
我怀疑跟具体系统的中断机制有关,用odacharlee 那段脚本,在windows下两次按ctrl+c会继续运行,ctrl+break退出;
但在Sun Studio 11下按了一次ctrl+c后,再按ctrl+c或ctrl+break都不会有反应
不同的操作系统下信号不一样,正常
太奇怪了,在你们的机器上按两次Ctrl + C都能继续么? 为什么我这里第二次就跳出来了呢??

下面是三次测试:
1。
C:\Downloads\test>perl _odacharlee.pl
Processing..
Processing..
Processing..
Processing..
Break? y          <= 第一次按Ctrl+C,然后输入y, 退出, 正常

C:\Downloads\test>perl _odacharlee.pl
Processing..
Processing..
Processing..
Processing..
Processing..
Break? n       <= 第一次Ctrl+C,然后随便按个键,继续运行,正常
Processing..
Processing..
Processing..
^C                   <= 第二次,就退出了阿
C:\Downloads\test>perl _odacharlee.pl
Processing..
Processing..
Processing..
Processing..
Break? Processing..   <= 第一次Ctrl+C后,什么都不输入,再一次Ctrl+ C,就是这个效果
^C
C:\Downloads\test>