gpt4 book ai didi

perl - 我如何判断 sleep 是否是在我的系统上使用 perl 警报实现的?

转载 作者:行者123 更新时间:2023-12-01 11:04:35 25 4
gpt4 key购买 nike

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

我可以使用这个 shell 管道检测到这一点(来自 this other question 的想法):

strace perl -e 'sleep 1' 2>&1 | grep 'sleep\|alarm'

如果 sleep 是通过警报实现的,您将在输出中看到警报系统调用。否则你会看到一个不同的 sleep 系统调用,如下所示,来自 Ubuntu 10.04.2:

execve("/usr/bin/perl", ["perl", "-e", "sleep 1"], [/* 26 vars */]) = 0
nanosleep({1, 0}, 0xbfacba54) = 0

但是,我正在寻找简洁的纯 perl 代码(最好是单行代码)来检测它以及您应该期望看到的警报是否是 sleep 的基础,如果不是,则应该期待什么。

注意:

  • 这个问题不是在寻找如何防止闹钟打扰 sleep 。那是asked and answered .
  • 不寻找通过警报实现 sleep 时的解决方法。或许你可以在另一个问题上提问和回答。
  • 这不是 perl-golfing 问题。我不是在寻找最简洁的方式。
  • 我这样做并不是为了任何生产代码,这只是出于好奇。

最佳答案

wikipedia entry on SIGALRM状态:

[SIGALRM] is sometimes used to implement the sleep function; consequently, programs cannot reliably use alarm to "wake up" from a delay caused by sleep.

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

 perl -e 'alarm 1; sleep 2; print "slept\n"';

如果通过警报实现 sleep ,则输出将“ sleep ”,因为对 sleep 的调用将重置警报并在新的 SIGALRM 到达时接管处理。如果以另一种方式实现 sleep ,则输出将是“闹钟”,表明已触发默认警报处理程序。

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

(有趣的是,维基百科条目引用了 sleep 函数的 perl 文档)

关于perl - 我如何判断 sleep 是否是在我的系统上使用 perl 警报实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com