核心訊號實現

2021-06-23 10:05:04 字數 1789 閱讀 9257

訊號的概念大家不陌生。經常使用的kill命令,可以先執行的程序傳送訊號,執行程序在收到訊號後,做出相應的處理。在使用者態程式中關於訊號的程式設計,主要有如下的特點

1、程式可以給不同的訊號安裝特定的handler程式,這個handler有一定的格式,由使用者程式提供

2、應用程式可以配置,阻塞一些訊號,使得程式可以不響應這些訊號

3、訊號一般有預設的handler處理流程,應用程式如果不主動設定handler,則使用系統預設的handler

4、有一些訊號,使用者不能設定handler也不能阻塞

一般的使用者態訊號變成模式如下

我們不去分析使用者態如何進行訊號的程式設計,和訊號相關的一些應用。而主要分析,訊號在核心中的實現。主要有三個方面的內容。

1、訊號相關的核心資料結構

2、傳送訊號到程序的過程

3、訊號處理過程

訊號相關的核心資料結構

程序的資料結構task_struct中保持了訊號相關的資料結構,乙個是pending,這個結構上儲存了程序上尚未處理的訊號。乙個是sighand,這個結構上儲存了訊號對應的action。

struct

sigpending 

;  struct

sigqueue 

;  struct

sighand_struct 

; 傳送訊號到程序的過程

上面函式呼叫過程是傳送訊號到程序的過程。首先find_task_by_vpid通過pid找打對於的程序task_struct資料結構。然後呼叫send_signal函式進行訊號傳送,具體過程見下面的分析。

static

intsend_signal(

intsig, 

struct

siginfo *info, 

struct

task_struct *t, 

intgroup)  } 

else

if(!is_si_special(info)) 

out_set: 

signalfd_notify(t, sig); 

sigaddset(&pending->signal, sig); 

/*complete_signal函式喚醒休眠的程序*/

complete_signal(sig, t, group); 

return0; 

} 下面是喚醒休眠程序進行訊號處理的過程,這裡要主要,程序如果處於

task_uninterruptible

狀態,則程序不能被喚醒。這也是有時候用

kill命令無法殺掉一些休眠的程序的原因。

void

signal_wake_up(

struct

task_struct *t, 

intresume) 

訊號處理過程

程序處理訊號的函式是do_signal,呼叫這個函式的位置是,程序從核心態進入到使用者態時會呼叫這個函式。呼叫訊號的handler在使用者態執行,執行完之後通過膠粘**再次回到核心態來。

核心產生訊號

之前只知道核心往使用者空間傳送訊號可以用 非同步通知 昨天接觸到乙個新的函式,查了一下ulk3 page431 發現核心中有一族函式專門為程序產生訊號的。由於自己之前沒用過,最近又在看別的東西,先羅列在這 intsend sig int sig,struct task struct p,int pr...

核心 訊號量

核心訊號量和自旋鎖類似,作用也是保護資料。不同之處是,程序獲取核心訊號量嘚瑟時候,如果不能獲取,則程序進入睡眠狀態。down dev sem up dev sem 核心訊號量和自旋鎖的不同 1 核心訊號量 不能用在 中斷處理函式 和 tasklet 等不可睡眠的場景 2 深層次的原因 linux核心...

linux2 6 32核心訊號量的實現

首先看看訊號量的相關資料結構 include linux semaphore.h struct semaphore 訊號量的初始化 include linux semaphore.h define declare mutex name struct semaphore name semaphore ...