perl - 如何在 Perl 中的 x 秒后创建中断?

标签 perl timer interrupt

让我用代码示例解释任务:

#!/usr/bin/perl
use strict;
use warnings;

my $t = 3;

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    print "Start $t\n";
    alarm(10);
    sleep($t);  # instead of this I have some data that collect code
    alarm(0);
    print "done with $t\n";
};

if ($@) {
    die unless $@ eq "alarm\n";
    print "timeout\n";
}

代替 sleep 我有一些将数据推送到数组的代码。数组将保证在 `x 秒内由所需数据填充。

问题:如何在 x 秒后打印数组,而不使用 sleep(非阻塞方式)?

据我所知,在 perl 中设置计时器的最简单方法是使用 $SIG{ALRM}。但是如果我不需要计时器(不能使用sleep)怎么办,我只需要设置一个必须在预定义的秒数后运行的中断?也许我应该使用 SIGINT 来完成这项任务?

感谢任何帮助。

最佳答案

要创建您自己的中断,您需要两个执行线程。一种方法是启动一个子进程,该子进程将在满足某些条件时向其父进程发出信号。

$SIG{USR1} = \&code_to_run_after_interrupt;
my $ppid = $$;          # process id of parent
if (fork() == 0) {
    # child process
    sleep 15;
    kill 'USR1', $ppid;
    exit;
}
... main execution thread

fork 调用 15 秒后,您的主脚本将停止其正在执行的操作,在名为 code_to_run_after_interrupt 的子例程中执行代码,然后恢复主线程执行.

(我在这里使用 SIGUSR1 因为处理 SIGINT 可能会让你无法使用 Ctrl-C 来停止你的程序)

关于perl - 如何在 Perl 中的 x 秒后创建中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53100582/

相关文章:

linux - 将 Perl 脚本转换为 Bash

ios - 两个日期之间的计时器倒计时

c - Linux下如何用C实现timer的回调函数

algorithm - 如何停止进程并开始其他进程而不返回到 Arduino 中的初始进程

linux - 检查挂起后恢复系统的Linux内核中断

perl - 在 Perl 中根据哈希值打印键

php - 解析大型 XML 数据

excel - 使用电子表格::SimpleExcel

android - 在android中以固定速率安排java定时器间隔后如何修改它?

c - 通过中断在模式之间切换