Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何判断我的系统是否使用perl中的alarm实现了睡眠?_Perl - Fatal编程技术网

我如何判断我的系统是否使用perl中的alarm实现了睡眠?

我如何判断我的系统是否使用perl中的alarm实现了睡眠?,perl,Perl,perl文档中有许多地方警告不要将睡眠与报警结合使用,因为睡眠可以通过报警实现。但是,文档没有说明如果系统出现这种情况,会出现什么症状 我可以使用这个shell管道(idea)检测到这一点: 如果通过alarm实现睡眠,您将在输出中看到报警系统调用。否则,您将看到Ubuntu 10.04.2中的另一个睡眠系统调用,如下所示: execve("/usr/bin/perl", ["perl", "-e", "sleep 1"], [/* 26 vars */]) = 0 nanosleep({1,

perl文档中有许多地方警告不要将睡眠与报警结合使用,因为睡眠可以通过报警实现。但是,文档没有说明如果系统出现这种情况,会出现什么症状

我可以使用这个shell管道(idea)检测到这一点:

如果通过alarm实现睡眠,您将在输出中看到报警系统调用。否则,您将看到Ubuntu 10.04.2中的另一个睡眠系统调用,如下所示:

execve("/usr/bin/perl", ["perl", "-e", "sleep 1"], [/* 26 vars */]) = 0
nanosleep({1, 0}, 0xbfacba54)           = 0
然而,我正在寻找简洁的纯perl代码(最好是一行代码)来检测它,以及您应该看到的警报是否是睡眠的基础,以及如果警报不是睡眠的基础,应该看到的内容

注:

  • 这个问题不在于如何防止闹钟打断睡眠。这一直是个问题
  • 当通过报警实现睡眠时,不寻找解决方法。也许你可以用另一个问题来回答这个问题
  • 这不是一个perl高尔夫问题。我不是在寻找最简洁的方式
  • 我这样做不是为了任何生产代码,只是出于好奇
    • 各州:

      [SIGALRM]有时用于实现睡眠功能;因此,程序无法可靠地使用报警从睡眠引起的延迟中“唤醒”

      基于此,我猜测以下将检测睡眠是否通过报警实现:

       perl -e 'alarm 1; sleep 2; print "slept\n"';
      
      如果通过报警实现睡眠,则输出将为“睡眠”,因为对睡眠的调用将重置报警,并在新信号到达时接管处理。如果以另一种方式实现睡眠,则输出将为“Alarm clock”,显示已触发默认的报警处理程序

      不幸的是,我无法测试这个案例,因为我还没有找到一个通过报警实现睡眠的系统


      (有趣的是,Wikipedia条目引用了有关睡眠功能的perl文档)

      看起来Solaris的某些版本就是这样的例子。请参阅:@benrifkah,鉴于此,链接线程中的大多数解决方案根本没有帮助,因为它们试图修复相反的情况:
      睡眠
      被信号中断(如果定义了信号处理程序,就会发生这种情况)。@ikegami,感谢您指出这一点。我误解了那个问题。它提到了警报和睡眠的相互作用,尽管作者对问题原因的理解是错误的。我会更新我原来的问题。
       perl -e 'alarm 1; sleep 2; print "slept\n"';