Signal()是標(biāo)準(zhǔn)C,Sigaction()不是。
如果您能夠使用任何一種(也就是說,您在POSIX系統(tǒng)上),那么使用Sigaction();它沒有指定信號()是否重置處理程序,這意味著要在處理程序中再次調(diào)用signal()是可移植的。更糟糕的是,這是一場競賽:如果您快速地獲得兩個(gè)信號,而第二個(gè)信號是在重新安裝處理程序之前傳遞的,那么您將得到默認(rèn)的操作,這可能會殺死您的進(jìn)程。σ()另一方面,保證使用“可靠”的信號語義。您不需要重新安裝處理程序,因?yàn)樗肋h(yuǎn)不會被重置。使用SA_RESTART,您還可以獲得一些系統(tǒng)調(diào)用來自動(dòng)重新啟動(dòng)(因此您不必手動(dòng)檢查EINTR)。σ()有更多的選擇和可靠,所以它的使用是鼓勵(lì)的。
Psst.。不要告訴任何人我告訴過您這一點(diǎn),但是POSIX目前有一個(gè)函數(shù)bsd_signal(),它的作用類似于signal(),但是給出了BSD語義,這意味著它是可靠的。它的主要用途是移植假定有可靠信號的舊應(yīng)用程序,POSIX不建議使用它。