訊號量與非同步通知
一 訊號量原理概述
1linux
當中的訊號處理機制
程序管理塊(pcb)中有幾個位元組的位元位,每乙個位元位代表著一種訊號。程序首先要註冊乙個函式用於處理對應的訊號,一般來說呼叫signal
或者是signalaction
函式。當用kill
指令向某乙個程序傳送訊號,就會陷入核心,通過程序號(pid
)取得對應得pcb
,然後將pcb
中對應訊號得位元位置位。在核心返回使用者空間之前,會進行pcb
的訊號位元位檢查,檢查有置位時,就呼叫前面註冊得相對應得函式進行處理。
2傳送訊號
使用kill指令傳送訊號時,必須給出的引數有pid
。核心通過pid
索引到pcb
,然後將對應得位元位置位,即完成了訊號的傳送。一般來說,對於非同步通知,訊號的傳送是驅動程式需要完成的任務。
3訊號遮蔽
每個程序都有乙個訊號集,用於描述哪些訊號被遮蔽,這個訊號集叫做訊號掩碼。訊號遮蔽並非讓程序不響應訊號,只是延遲了訊號的到達,只要遮蔽解除,訊號響應會繼續進行。
4捕捉訊號
程序對訊號的響應就是捕捉到了訊號。在程序初始化時,每乙個訊號都會被註冊乙個預設的處理函式。我們可以呼叫signal來註冊自己的處理函式用於取代預設處理函式。這個signal
也可以說是訊號捕捉函式。捕捉訊號是使用者程式的任務,驅動程式不會干涉。
二 訊號量操作
1訊號量的捕獲
#include
typedefvoid (*sighandler_t)(int)
signalhandler_tsignal(int signum, sighandler_t handler)
#include
intsigaction(int signum, const struct sigaction *act,
structsigaction *oldact)
其中signum表示要操作的訊號量
act是新的操作方式
oldact是舊的操作方式
structsigaction
成員說明: sa_handler是訊號量處理函式
sa_sigaction用於獲取訊號量詳細資訊的函式
mask用於訊號處理函式期間遮蔽訊號的訊號掩碼
sa_flag用於控制訊號處理行為的標誌位
sa_restorer已廢棄,不使用
2訊號的傳送
原理:在使用者程式當中,呼叫了fasync函式時給出兩個命令標誌,分別為f_setdowm
和f_setfl
(set
fasync
list
),前者會呼叫f_setdown
函式,該函式將當前程序的pid
記錄到file->f_owner
當中去。後者呼叫會導致呼叫setfl
函式,該函式呼叫到驅動程式當中得fasync
函式,在fasync
函式中會呼叫fasync_hlper
函式,這個函式將當前程序加入到fasync
鍊錶當中去。當呼叫到kill_fasync
函式傳送訊號時,就會歷遍這個鍊錶,並且呼叫sed_sigio
函式傳送訊號。(sed_sigio(fowm,fa->fa_fd,band)
)。
非同步 訊號量
1 自己手動 釋放 from tornado import gen from tornado.ioloop import ioloop from tornado.locks import semaphore sem semaphore 2 async defworker worker id awai...
systemV訊號量 與 Posix訊號量
一 函式上的區別 訊號量有兩種實現 傳統的system v訊號量和新的posix訊號量。它們所提供的函式很容易被區分 對於所有system v訊號量函式,在它們的名字裡面沒有下劃線。例如,應該是semget 而不是sem get 然而,所有的的posix訊號量函式都有乙個下劃線。下面列出了它們提供的...
Linux非同步 訊號量集
在實際的應用中乙個應用程式需要對多個訊號進行處理,為了方便,linux系統引進了訊號集的概念。訊號集用多個訊號組成的資料型別sigset t.可用以下的系統呼叫設定訊號集中所包含的資料。1 sigset t在 include asm generic signal.h中定義。typedef struc...