linux-0.11核心 訊號處理小結

來源:互聯網
上載者:User

linux-0.11核心中關於訊號處理這部分內容主要涉及四個檔案system_call.s,signal.h,signal.c,exit.c。其中signal.h,signal.c中定義和實現了核心中所有有關訊號處理的函數,當然exit.c中還有兩個與訊號相關的函數send_sig與tell_father。

linux-0.11核心中定義了22種不同的訊號,20種是posix.1中規定的,還有兩個專用的:SIGUNUSED(未定義)和SIGSTKFLT(堆棧錯)。

對於一個進程來說,收到一個訊號後,有三種處理方式:

  1. 忽略該訊號,但SIGKILL和SIGSTOP除外
  2. 捕獲該訊號,自訂處理函數
  3. 執行預設操作,核心為每種訊號都提供一種預設操作——終止進程的執行

訊號處理過程

當進程調用系統調用結束返回後,對訊號進行識別處理,若進程結構的訊號位元影像表明該進程接收到訊號,則調用訊號處理函數do_signal,該函數就會把訊號的處理控制代碼插入到使用者程式堆棧中。然後執行訊號處理常式,之後再繼續執行使用者的程式。

在這個過程中,由系統調用signal或sigaction向進程設定訊號處理控制代碼。訊號的識別由system_call.s中的system_call函數完成,並負責調用do_signal。do_signal的主要作用是將訊號處理函數控制代碼插入到使用者堆棧中(使用者程式執行系統調用時進入了核心堆棧),並在do_signal返回後立刻執行訊號處理函數。do_signal返回後,system_call.s把堆棧eip以下的所有值彈出(見下面圖2,及system_call.s中120-127行代碼),iret之後把剩下的cs:eip,eflags,ss:esp彈出,轉向使用者態。

下面是趙老師關於訊號處理常式的調用方式給出的兩張圖,貼出來有助於理解

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.