進程捕捉到信號并對其進行處理時,進程正在執行的指令序列就被信號處理程序臨時中斷,它首先執行該信號處理程序中的指令。如果從信號處理程序返回(例如信號處理程序沒有調用exit或longjmp),則繼續執行在捕捉到信號時進程正在執行的正常指令序列。但在信號處理程序中,不能判斷捕捉到信號時進程在何處執行。如果程序正在執行malloc,在其堆中分配另外的存儲空間,而此時由于捕捉到信號而插入執行該信號處理程序,其中又調用malloc,則可能會對進程造成破壞,因為malloc通常為它所分配的存儲區維護一張鏈接表,而插入執行信號處理程序時,進程可能正在更改此鏈接表。又例如,若進程正在執行getpwnam這種將其結果存放在靜態存儲單元中的函數,其間插入執行信號處理程序,它又調用這樣的函數,則返回給正常調用者的信息可能會被返回給信號處理程序的信息覆蓋。
沒有列入表10-3中的大多數函數是不可重入的,其原因為:(a)已知它們使用靜態數據結構,(b)它們調用malloc或free,或(c)它們是標準I/O函數。
應當了解,即使信號處理程序調用的是列于表10-3中的函數,但是由于每個線程只有一個errno變量,所以信號處理程序可能會修改其原先值。因此,作為一個通用的規則,當在信號處理程序中調用表10-3中列出的函數時,應當在其前保存、在其后恢復errno。
若在信號處理程序中調用一個不可重入函數,則其結果是不可預測的。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答