Chr*_*ons 3 perl signals solaris sparc
在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";
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,"就是醒来!" 从不打印 - 相反,程序结束,"闹钟"响应屏幕.只有在睡眠时才会发生这种情况 - 如果我编写的程序执行大量数学操作并需要10秒钟才能运行,那么一切正常.它也只发生在chroot环境中.
我已经转储了%SIG,它有一个'ALRM => undef'的条目,这是预期的 - 非chrooted环境具有相同的行为.但是,如果我将脚本更改为包括:
$SIG{ALRM} = sub {};
Run Code Online (Sandbox Code Playgroud)
......一切正常 那么,这笔交易是什么?我没有很多使用Solaris的经验,但必须有一种方法可以使默认的信号处理程序正常运行.
我建议只需更换sleep 1电话select(undef, undef, undef, 1)并避免整个问题.
从你给的症状,我打赌你执行chroot Perl脚本正在执行sleep中的术语SIGALRM(如通过POSIX允许的),以及由于某种原因perl的不没收的信号,因为它应该,也许是因为它不是"期待这种实施.它是你自定义构建的perl吗?这是chroot的特质libc吗?perl -e "sleep 1"在chroot下是否显示同样的问题?等等.很难说无法访问环境和像桁架这样的工具.
同样,可以避免整个问题: select不会捣乱SIGALRM.