A. linux系統下進程的信號(signal)處理流程是怎麼樣的
信號處理是Linux下進程管理的重要機制。信號的來源可分為三大類:硬體異常、外部信號和顯示請求。
硬體異常產生的錯誤包括非法內存訪問、除數為0等;外部信號則通過按鍵操作如Ctrl-C或定時器到期產生;顯示請求則通常由`kill`函數觸發。
在Linux中,每個進程由`task_struct`結構創建,包含`task vector`數組,其大小決定系統最大進程數,默認為512。`task_struct`中`Signal_Strct`包含`list_head`和`sigset_t`表,定義64種信號含義。
信號處理機制基於表存儲,即每個進程都存有一張表,描述每種信號的意義。信號觸發和發送是非同步的,內核負責轉發以確保安全,避免任意程序隨意中止進程,如SIGSTOP和SIGKILL信號。
發送信號時,進程A根據信號表設置對應項。內核驗證許可權後更新B進程的信號表。信號處理沒有排隊機制,後續相同信號會被阻塞丟棄。內核發送中斷請求給B進程,觸發信號處理函數。信號處理後,B進程返回,再次設置frame,繼續執行。
使用時,通過`kill`函數發送信號,接收進程調用`sighandler`或`signalaction`處理信號消息。此過程直觀展示了Linux下進程信號處理的機制與流程。