訊號量與非同步通知

2021-06-23 09:00:34 字數 2172 閱讀 5974

訊號量與非同步通知
一 訊號量原理概述
1

linux

當中的訊號處理機制

程序管理塊(pcb

)中有幾個位元組的位元位,每乙個位元位代表著一種訊號。程序首先要註冊乙個函式用於處理對應的訊號,一般來說呼叫signal

或者是signalaction

函式。當用kill

指令向某乙個程序傳送訊號,就會陷入核心,通過程序號(pid

)取得對應得pcb

,然後將pcb

中對應訊號得位元位置位。在核心返回使用者空間之前,會進行pcb

的訊號位元位檢查,檢查有置位時,就呼叫前面註冊得相對應得函式進行處理。

2

傳送訊號

使用kill

指令傳送訊號時,必須給出的引數有pid

。核心通過pid

索引到pcb

,然後將對應得位元位置位,即完成了訊號的傳送。一般來說,對於非同步通知,訊號的傳送是驅動程式需要完成的任務。

3

訊號遮蔽

每個程序都有乙個訊號集,用於描述哪些訊號被遮蔽,這個訊號集叫做訊號掩碼。訊號遮蔽並非讓程序不響應訊號,只是延遲了訊號的到達,只要遮蔽解除,訊號響應會繼續進行。
4

捕捉訊號

程序對訊號的響應就是捕捉到了訊號。在程序初始化時,每乙個訊號都會被註冊乙個預設的處理函式。我們可以呼叫signal

來註冊自己的處理函式用於取代預設處理函式。這個signal

也可以說是訊號捕捉函式。捕捉訊號是使用者程式的任務,驅動程式不會干涉。

二 訊號量操作
1

訊號量的捕獲

#include

typedef

void (*sighandler_t)(int)

signalhandler_t

signal(int signum, sighandler_t handler)

#include

int

sigaction(int signum, const struct sigaction *act,

struct

sigaction *oldact)

其中signum

表示要操作的訊號量

act

是新的操作方式

oldact

是舊的操作方式

struct

sigaction

成員說明: 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...