訊號的概念大家不陌生。經常使用的kill命令,可以先執行的程序傳送訊號,執行程序在收到訊號後,做出相應的處理。在使用者態程式中關於訊號的程式設計,主要有如下的特點struct1、程式可以給不同的訊號安裝特定的handler程式,這個handler有一定的格式,由使用者程式提供
2、應用程式可以配置,阻塞一些訊號,使得程式可以不響應這些訊號
3、訊號一般有預設的handler處理流程,應用程式如果不主動設定handler,則使用系統預設的handler
4、有一些訊號,使用者不能設定handler也不能阻塞
一般的使用者態訊號變成模式如下
我們不去分析使用者態如何進行訊號的程式設計,和訊號相關的一些應用。而主要分析,訊號在核心中的實現。主要有三個方面的內容。
1、訊號相關的核心資料結構
2、傳送訊號到程序的過程
3、訊號處理過程
訊號相關的核心資料結構
程序的資料結構task_struct中保持了訊號相關的資料結構,乙個是pending,這個結構上儲存了程序上尚未處理的訊號。乙個是sighand,這個結構上儲存了訊號對應的action。
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 ...