APUE學習筆記——信號

  1. 信號可以自己擴展。
  2. 信號產生:1)用戶操作:ctl+c;2)硬件異常:除0,內存越界等;3)進程調用kill函數可以將信號發送到另一個進程。4)用戶使用kill命令。5)某軟件條件產生。
  3. 信號處理:
    1. 忽略,但是SIGKILL和SIGSTOP不可以忽略,他們向超級用戶提供了進程終止或停止的可靠方法。硬件產生異常也不可以忽略。使用SIG_IGN忽略。
    2. 捕捉信號,爲信號註冊一個函數。SIGKILL和SIGSTOP不可以捕捉。(爲什麼?)
    3. 執行系統默認。
  4. 信號詳細說明:
  5. 被中斷的系統調用:當捕捉到某個信號時,被中斷的是內核中執行的系統調用,而不是函數調用。
  6. 若在信號處理程序中處理一個不可重入函數,結果是不可預見的。
  7. 使用sigaction可設置SA_NOCLDWAIT標誌以避免子進程僵死。
  8. 進入信號處理程序後,首先調用signal函數以重新設置此信號的處理程序(在信號被複位回其默認值時,它可能會被丟失,立即重新設置可以減少此窗口時間。)
  9. pause函數使調用進程掛起直至捕捉到一個信號。
  10. 每個進程都有一個信號屏蔽字,可以設置要阻塞遞送到進程的信號。
  11. 信號集可以表示多個信號的集合。
  12. sigprocmask:可以設置進程的信號屏蔽字。只爲單線程設計。
  13. sigpending可以獲得被阻塞而沒有遞送到進程的信號。
  14. abort(SIGABORT)的意圖是在進程終止之前由其執行所需要的清理操作。如果進程捕捉此信號並且調用exit或者_exit,則不會沖洗標準IO緩衝區。
  15. system函數需要忽略SIGINT(CTRL+C)和SIGQUIT,阻塞SIGCHILD。中斷信號會發送個包括子進程在內的多個進程。忽略的原因是system可能執行的是交互式命令,會產生中斷信號,但是隻要子進程處理即可。阻塞SIGCHILD信號時因爲system要獲取子進程的執行狀態,而不是被父進程捕捉導致system不知道執行結果。
  16. 忽略信號是指不處理,阻塞是指不上報給進程,但會保存起來(不是一個隊列)。
  17. sigsuspend:阻塞,等待任意一個信號後返回。
  18. 信號處理過程:進程捕捉到信號進行處理時,進程正在執行的指令序列就被信號處理程序臨時中斷,它首先處理該信號處理程序中的指令。如果衝信號處理程序中返回,則繼續執行捕捉到信號時進程正在執行的指令序列。如果這個時候信號處理程序調用不可衝入函數,結果是不可預測的。對於這個問題好像在那裏看到過,可以使用一個文件描述法來主動讀取信號並處理。而不是系統自動調用。
發佈了291 篇原創文章 · 獲贊 48 · 訪問量 158萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章