我如何判断我的系统是否使用perl中的alarm实现了睡眠?
perl文档中有许多地方警告不要将睡眠与报警结合使用,因为睡眠可以通过报警实现。但是,文档没有说明如果系统出现这种情况,会出现什么症状 我可以使用这个shell管道(idea)检测到这一点: 如果通过alarm实现睡眠,您将在输出中看到报警系统调用。否则,您将看到Ubuntu 10.04.2中的另一个睡眠系统调用,如下所示:我如何判断我的系统是否使用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,
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"';