簡體   English   中英

忽略一個信號並告訴它在Perl中什么也不做的區別是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM