gpt4 book ai didi

perl - 在 Solaris 9 上 sleep 时的 SIGALRM

转载 作者:行者123 更新时间:2023-12-03 18:35:28 28 4
gpt4 key购买 nike

在 Solaris 9 (Sparc) 上的 chroot 环境中运行 Perl 时,我遇到了一些奇怪的错误。我们使用的是自定义 Perl,但它几乎完全是 Perl 5.8.7,并且该版本已在包括 Solaris 8-10 在内的各种平台上运行多年。

下面的代码非常简单:

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

print "About to sleep(1)\n";
sleep 1;
print "Just woke up!\n";

但是,如果我运行它,“刚醒来!”永远不会被打印 - 相反,程序结束并且“闹钟”在屏幕上回响。这只发生在有 sleep 的情况下 - 如果我编写了一个程序,该程序进行了大量数学运算并需要 10 秒才能运行,那么一切正常。它也只发生在 chroot 环境中。

我已经转储了 %SIG,它有一个 'ALRM => undef' 条目,这是预期的 - 非 chroot 环境具有相同的行为。但是,如果我将脚本更改为包括:
$SIG{ALRM} = sub {};

...一切正常。那么,有什么关系呢?我对 Solaris 没有太多经验,但是必须有一种方法可以使默认信号处理程序正常运行。

最佳答案

我建议简单地更换 sleep 1调用 select(undef, undef, undef, 1)并避免整个问题。

从你给出的症状来看,我敢打赌你的 chroot 的 perl 脚本正在实现 sleepSIGALRM 方面(正如 POSIX 所允许的那样),并且出于某种原因,perl 没有按应有的方式捕获该信号,也许是因为它不期望该实现。它是您自定义的 perl 版本吗?这是 chroot 中的一个特质 libc ?是否perl -e "sleep 1" chroot下显示同样问题?等等等等。很难说没有访问环境和像truss这样的工具。

同样,可以避免整个问题:select不会乱用 SIGALRM .

关于perl - 在 Solaris 9 上 sleep 时的 SIGALRM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1085215/

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