歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux系統調用之信號

linux系統調用之信號

日期:2017/3/1 11:43:11   编辑:關於Linux

信號是有限形式的進程間通信中使用的Unix,類Unix和其他POSIX兼容的操作系統的。信號是一個異步發送到通知處理或特定的線程,以通知它發生事件的同一進程內。

當發送信號時,操作系統中斷目標進程的正常執行的流動來傳遞信號。可以執行過程中的任何中斷非原子指令。如果進程事先注冊的信號處理程序,該程序被執行。否則,默認信號處理程序被執行。

嵌入式程序可能會發現進程間通信有用信號,作為計算和內存占用的信號很小。

系統調用發送指定的信號到指定的過程,如果權限允許。類似地,殺命令允許用戶將信號發送到處理。

例外情況,如被零除或分段違例將產生信號(在這裡,SIGFPE “浮點異常”和SIGSEGV “ 賽格心理狀態v分別iolation”,這兩者在默認情況下會導致核心轉儲和程序退出)。

內核可以產生信號,通知事件的過程。例如,SIGPIPE當一個進程寫入到已經由讀取器關閉一個管道將產生; 默認情況下,這將導致進程終止,施工時既方便外殼管道。

在鍵入某些組合鍵控制終端正在運行的進程會導致系統發送某些信號:

按Ctrl-C (在舊的Unix,DEL)發送一個INT信號(“中斷”,SIGINT); 默認情況下,這將導致進程終止。

按Ctrl-Z發送TSTP信號(“終點站”,SIGTSTP); 默認情況下,這將導致程序中止執行。

按Ctrl - \發出退出信號(SIGQUIT); 默認情況下,這將導致進程終止並轉儲核心。

按Ctrl-T (不支持所有的UNIX)發送一個信息信號(SIGINFO); 通過默認,並且如果由命令所支持,這導致操作系統以顯示有關正在運行的命令的信息。

用現代的操作系統這些默認組合鍵可以與被改變的stty命令。

首先,我們先寫一個死循環

\

然後

\

信號處理程序可以與安裝信號系統調用。如果信號處理程序未安裝特定的信號,則使用默認的處理程序。否則信號被截取和信號處理程序被調用。這個過程也可以指定兩個默認的行為,而無需創建一個處理程序:忽略信號(SIG_IGN),並使用默認的信號處理(SIG_DFL)。有兩個信號不能被攔截和處理:SIGKILL和SIGSTOP。

正如上圖所示的那樣,默認操作便是終止進程。,那自定義呢?又該怎麼辦?

首先,我們來了解一個函數

\

然後再寫一個程序:這個程序的主要就是接收到2號信號,便跳轉到handle函數

\

最後,我們來看看結果:

\

這裡,你可以有三種方法實現發送信號2給程序

第一種.便是上面所說的CTRL+C

第二種.硬件產生信號

第三.便是調用kill(2)函數亦可以實現

接下來,再給大家說一種軟件條件產生的信號

\

把上面的文件,簡單修改,便可實現。

來看看,它的效果:

\

這個方法可以測你的計算機一秒能跑多少

\

讀者可以試試看

接下來,我們我試試剛才的那個程序,對它是否適用,然後驗證上述的正確性

\

在看看結果:

\

看來,是正確的。

信號處理是脆弱的競爭條件。作為信號是異步的,另一信號(即使是相同類型的)可以在信號處理程序的執行過程中被傳遞到該過程。

所述sigprocmask()執行呼叫可用於阻止和解除的信號傳送。阻塞的信號不傳遞到這個過程,直到暢通。不能被忽略信號(SIGKILL和SIGSTOP)不能被阻止。

\

\

接下來,給大家看看這個:

\

接下來,我們再寫個小程序

\

在看看結果:

\

信號可引起正在進行一個系統調用的中斷,將其留給應用程序來管理非透明重啟。

信號處理應寫入的方式,不會導致任何不必要的副作用,如errno的改變,信號掩碼改變,信號配置變化和其他全球性進程屬性更改的非使用折返功能,例如,的malloc或printf的,內部信號處理程序也是不安全的。

信號處理器可以代替把信號轉換成一個隊列並立即返回。然後主線程將繼續“不間斷”,直到信號被從隊列中取出,例如在事件循環。“不間斷”在這裡指操作該塊可能會過早返回並必須恢復,如上所述。信號應從主線程隊列由處理並沒有工人池,作為重新引入異步性的問題。

與硬件異常的關系

一個進程的執行可能導致硬件的產生異常,例如,如果過程試圖除以零或招致一個TLB未命中。

在類Unix操作系統,這個事件會自動更改處理器的背景下,開始執行內核 異常處理程序。在一些例外,如一個的情況下缺頁,內核具有足夠的信息,以充分處理該事件本身和恢復過程的執行。

其他異常,然而,內核不能智能處理和必須代替推遲異常處理操作出錯進程。此延遲是通過信號機制,其中,所述內核發送到處理對應於當前異常的信號來實現的。例如,如果一個進程的上試圖整數除以零的x86 CPU,一個除法錯誤,就可以產生異常,引起內核向發送SIGFPE信號的過程。

同樣地,如果過程試圖其外部訪問的存儲器地址的虛擬地址空間,內核將經由通知這個違反的過程SIGSEGV信號。信號名稱和異常之間的精確映射顯然是依賴於CPU,因為異常類型的架構不同。

Copyright © Linux教程網 All Rights Reserved