當要處理信號捕捉問題時,咱們能夠爲某一信號設置自定義的信號處理函數,這個信號處理函數會對正在執行的進程有怎樣的影響?算法
1、對進程執行的干預:編程
1.當信號被捕捉時,進程正在執行用戶態程序指令,(即用戶自行編寫的代碼 或 庫程序代碼):數據結構
此種狀況下,進程正執行的代碼將被暫停,轉而去執行信號處理函數。只要信號處理函數中 不 exit()終止當前進程 或 用longjmp跳轉到別的地方,那麼當信號處理函數執行完成後,進程將繼續從被信號中斷處開始執行。函數
2.當信號被捕捉時,進程正在執行核心態代碼,(系統調用-內核代碼):spa
此時,除非系統調用結束,或者 調用了sleep原語進行睡眠(且非快速I/O的短暫睡眠)讓出CPU時,信號處理函數纔可執行,不然信號處理函數沒法打斷進程當時的執行。指針
2、易致使的問題調試
當信號處理函數打斷了進程當時的代碼執行,進行了其它的操做,這很容易致使代碼重入的問題,尤爲對那些依賴全局或靜態數據結構的算法操做影響很大。token
好比:進程
char *strtok(char *string,char *token)函數,用於根據給定的分解符token,從給定的字符串string中分出一個單詞。返回指向單詞的首字符指針。字符串
當第一個參數爲NULL時,strtok函數將在上一次執行該函數結束的位置(第一個被分出的單詞的尾部)繼續尋找下一個單詞。
這個功能是根據strtok函數內部使用了靜態變量記錄了上次的結束位置。
若是strtok函數當第一個參數爲NULL時的執行被信號處理函數停止,並且信號處理函數中也使用了strtok函數,那麼當進程返回到被中斷前的strtok函數執行時,就會出現錯誤,由於依賴的全局變量被改變了。
信號處理函數帶來的代碼重入問題,在調試中很困難,由於信號到達時間是有必定隨機性的(很差控制),因此錯誤重現很困難。因此咱們在編程時,儘可能不要用信號機制實現過度複雜的功能。