2012-08-22 19 views

回答

1

該示例中的代碼很難將更改本地化爲代碼的該部分或從其調用的任何代碼。

由於信號不再安全,因此不能100%保證在代碼之外不會有任何代碼繞過安全信號。在這個例子中,超時的呼叫是一個DBI->連接。對於大多數DBD的,這將主要是用C來實現,除非C代碼可處理被中止,並試圖再次,你可能會發現,內部的DBD,或使用的庫的一些數據結構,被留在一個變化無常的狀態。

示例代碼出錯的可能性可能非常小。我對問題的親身經歷是,我已經使用了傳統的Perl信號處理多年的安全信號進行了介紹,並很長時間我從來沒有一個問題之前。我對我的信號處理程序所做的事情甚至沒有十分謹慎。然後,我們成功地打了一個數據集,實際上沒有觸發內存破壞約1出過100次的。只是修改信號處理程序以使用更好的實踐,與示例中的類似,可以消除我們的問題。

+0

的問題是不太好。我想知道具有這種信號處理的腳本是否會影響其他腳本/進程。我不相信,但我仍然要求安全。 –

1

這甚至意味着什麼?通過使用不安全的信號,你可以破壞Perl的內部和Perl變量。如果非重入C庫調用中斷,它也會導致問題。

這可能會導致SEGFAULT和其他問題,並且這些問題可能只會在超時有效的塊之外出現。

+0

這個問題不是很好。我想知道具有這種信號處理的腳本是否會影響其他腳本/進程。我不相信,但我仍然要求安全。 –

+1

不是直接的,沒有。它只會改變該進程的信號處理。 – ikegami