在Solaris 9(Sparc)的chroot環境中運行Perl時,我遇到了一些奇怪的錯誤。我們是使用自定義Perl,但它幾乎完全是Perl 5.8.7,這個版本已經在包括Solaris 8-10在內的各種平臺上運行了多年。在Solaris上睡覺時遇到SIGALRM 9
下面的代碼是非常簡單的:
#!/usr/bin/perl
use strict;
use warnings;
print "About to sleep(1)\n";
sleep 1;
print "Just woke up!\n";
但是,如果我運行, 「剛睡醒!」永遠不會被打印 - 相反,程序結束並且「鬧鐘」被回顯到屏幕上。這隻有在睡眠時纔會發生 - 如果我編寫的程序執行很多數學運算並需要10秒鐘才能運行,則一切正常。它也只發生在chroot環境中。
我已經轉儲了%SIG,其中有一個'ALRM => undef'的條目,這是預期的 - 非chrooted環境具有相同的行爲。但是,如果我將腳本更改爲包括:
$SIG{ALRM} = sub {};
...一切正常。那麼,交易是什麼?我沒有太多的Solaris經驗,但必須有一種方法可以使默認的信號處理程序正常工作。
不幸的是,我不能這樣做 - 我正在處理在多個平臺上運行的非常大的代碼庫。我沒有改變它只爲Solaris 9 :) 你提到的POSIX標準很可能是這種情況。我很確定我的perl構建不會混亂,但它可能是chroot的libc版本。謝謝:) – 2009-07-06 04:26:03
AFAICT,`select()`可以在所有平臺上工作... – Massa 2009-07-06 10:36:21