[英]What's the difference between ignoring a signal and telling it to do nothing in Perl?
如果我告訴Perl明確忽略一個信號,SIGINT沒有效果:
$SIG{INT} = 'IGNORE';
my $count = 0;
say $count++ and sleep 1 while 1;
然后按Control-C顯然沒有效果。 另一方面,如果我告訴它什么都不做:
$SIG{INT} = sub { };
my $count = 0;
say $count++ and sleep 1 while 1;
然后按Control-C有效! 它從sleep()調用中喚醒程序並立即遞增計數。 忽略信號並告訴它什么都不做之間的區別是什么?
在我的程序中,我想讓代碼在SIGINT上運行, 而不會破壞任何東西。 我想要的東西:
$SIG{INT} = sub { say "Caught SIGINT!"; return IGNORED; }; # runs without disrupting sleep
忽略信號並告訴它什么都不做之間的區別是什么?
在傳遞信號時仍會調用“無所事事”處理程序,在這種情況下會中斷sleep
調用。 另一方面,忽略的信號被系統簡單地丟棄,對過程沒有任何影響。
請參閱此處了解特定於C的更全面的參考。
信號傳遞可以中斷大量系統調用。 通常你可以檢查$!
(又名errno
)看看它是否是EINTR
並采取行動重新嘗試失敗的系統調用。
如果您的代碼的某些部分(在這種情況下,您的sleep()
調用)不會中斷,那么您可以使用POSIX::sigprocmask
在您處於關鍵部分時阻止信號。 應用程序收到的任何信號都將排隊,直到您取消阻止它們為止,此時它們將被傳遞。 我很確定當特定類型的多個信號被阻塞時會有一些有趣的語義(我認為它們可能合並成一個信號)。
這是IBM關於重入函數的一個很好的入門讀物 ,包含一些帶有sigprocmask
示例。
不知道為什么它沒有像你期望的那樣工作,但通常當我嘗試完成類似的事情時,除了INT信號之外我還會捕獲TERM信號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.