在實際的應用中乙個應用程式需要對多個訊號進行處理,為了方便,linux系統引進了訊號集的概念。訊號集用多個訊號組成的資料型別sigset_t.可用以下的系統呼叫設定訊號集中所包含的資料。
1、sigset_t在/include/asm-generic/signal.h中定義。
typedef struct sigset_t;
2、相應的系統呼叫函式:
#includeint sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigadd(sigset_t *set,int setnumber);
int sigdelset(sigset_t *set,int setnumber);
int sigismember(const sigset_t set,int signumber)
set表示訊號集指標,setnumber表示訊號。sigemptyset用於將set指向的訊號集設為空,即不包含任何訊號。
sigfillset用於將set指向的訊號集設為滿,即包含所有的訊號。
sigaddset用於向訊號集中新增訊號。
sigdelset用於向訊號集中刪除訊號。
以上函式成功返回0,失敗返回-1
sigismember用於檢測signumber是否在set中,若屬於返回1,不是返回0.
3、有時候不希望在接到訊號時就立即停止當前執行,去處理訊號,同時也不希望忽略該訊號,而是延時一段時間去呼叫訊號處理函式。這種情況是通過阻塞訊號實現的。
【訊號阻塞和忽略訊號的區別】
阻塞的概念和忽略訊號是不同的。作業系統在訊號被程序解除阻塞之前不會講訊號傳遞出去,被阻塞的訊號也不會影響程序的行為,訊號只是暫時被阻止傳遞。當程序忽略乙個訊號時,訊號會被傳遞出去但程序會將訊號丟棄。
sigprocmask設定對訊號遮蔽集內的訊號的處理方式(阻塞或不阻塞)
#include int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
int sigsuspend(const sigset_t*sigmask);
引數:
how:用於指定訊號修改的方式,可能選擇有三種
sig_block//將set所指向的訊號集中包含的訊號加到當前的訊號掩碼中。即訊號掩碼和set訊號集進行或操作。
sig_unblock//將set所指向的訊號集中包含的訊號從當前的訊號掩碼中刪除。即訊號掩碼和set進行與操作。
sig_setmask //將set的值設定為新的程序訊號掩碼。即set對訊號掩碼進行了賦值操作。
set:為指向訊號集的指標,在此專指新設的訊號集,如果僅想讀取現在的遮蔽值,可將其置為null。返回說明:oldset:也是指向訊號集的指標,在此存放原來的訊號集。可用來檢測訊號掩碼中存在什麼訊號。
成功執行時,返回0。失敗返回-1,errno被設為einval。
非同步 訊號量
1 自己手動 釋放 from tornado import gen from tornado.ioloop import ioloop from tornado.locks import semaphore sem semaphore 2 async defworker worker id awai...
訊號量集(主要是AND訊號量)
訊號量集 當利用訊號量機制解決了單個資源的互斥訪問後,我們討論如何控制同時需要多個資源的互斥訪問。訊號量集是指同時需要多個資源時的訊號量操作。1 and型訊號量集 and型訊號量集是指同時需要多個資源且每種占用乙個資源時的訊號量操作。當一段處理 需要同時獲取兩個或多個臨界資源時,就可能出現由於各程序...
訊號量集(主要是AND訊號量)
訊號量集 當利用訊號量機制解決了單個資源的互斥訪問後,我們討論如何控制同時需要多個資源的互斥訪問。訊號量集是指同時需要多個資源時的訊號量操作。1 and型訊號量集 and型訊號量集是指同時需要多個資源且每種占用乙個資源時的訊號量操作。當一段處理 需要同時獲取兩個或多個臨界資源時,就可能出現由於各程序...