標籤:style blog http color 使用 strong
是我自己的筆記,亂七八糟的。
文法:如果參數為const型,僅表示該參數在此函數的實現中不能被修改,不代表傳入的參數類型一定是const型
int sigsuspend(const sigset_t *sigmask);
程式碼片段:
sigset_t zeromask;sigemptyset(&zeromask);sigsuspend(&zeromask);
signal繼承問題:子進程會繼承父進程的signal mask 測試地址:http://blog.chinaunix.net/uid-29100821-id-4018170.html
理論說明:http://blog.csdn.net/lihuibo128/article/details/8556669
unix的讀寫函數:open,write,read
說明:http://www.cnblogs.com/Pierre-de-Ronsard/archive/2012/07/09/2582417.html
實驗1:訊號屏蔽字
1,構造一個進程:進程設定對某個訊號的處理函數,類比該訊號處理,檢驗是否如預期
2,構造一個進程:進程設定對某個訊號的處理函數,用sigprocmask設定,該進程對這一訊號屏蔽,類比該訊號,檢查是否如預期,使用其它訊號,檢查是否如預期
就能夠知道sigprocmask函數的功能。
sigpromask:用來設定進程的訊號屏蔽,哪些訊號不被進程所響應,及時設定了signal的訊號handler
實驗1擴充知識
與訊號集合相關的一組操作是:
標頭檔#include <signal.h>sigemptyset(sigset_t *set)初始化由set指定的訊號集,訊號集裡面的所有訊號被清空;sigfillset(sigset_t *set)調用該函數後,set指向的訊號集中將包含linux支援的64種訊號;sigaddset(sigset_t *set, int signum)在set指向的訊號集中加入signum訊號;sigdelset(sigset_t *set, int signum)在set指向的訊號集中刪除signum訊號;sigismember(const sigset_t *set, int signum)判定訊號signum是否在set指向的訊號集中。int sigaction( int sig, const struct sigaction *act,struct sigaction *oact )檢查、修改和指定訊號相關聯的訊號響應。
實驗1擴充知識int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);參數how如果為SIG_BLOCK,該函數會將第二個參數的訊號屏蔽集合附加到之前的訊號屏蔽集合中如果為SIG_UNBLOCK,該函數會設定新的訊號屏蔽集合為(原先的mask和第二個參數set的補集)的交集。如果為SIG_SETMASK,該函數會清除原先的訊號屏蔽集合,設定第二個參數的訊號屏蔽集合為新的訊號屏蔽集合 實驗2:測試先屏蔽某個訊號,再允許響應 該訊號(只產生一次該訊號)
int main(){ sigset_t sigset, oldmask; signal(SIGUSR1, proc_usr1); sigprocmask(0, NULL, &oldmask); sigaddset(&sigset, SIGUSR1); sigprocmask(SIG_BLOCK, &sigset, NULL); pr_mask("Block SIGUSR1"); sleep(12); sigprocmask(SIG_SETMASK, &oldmask, NULL);//設定新的屏蔽字為oldmask
//sigprocmask(SIG_UNBLOCK, &sigset, NULL);//清除設定的屏蔽字 pr_mask("Unblock SIGUSR1"); sleep(12); return 0;}
運行,產生一次SIGUSR1訊號
輸出:
Block SIGUSR1:SIGUSR1 proc_usr1Unblock SIGUSR1:
sigpending(sigset_t *set):取得當前進程的訊號屏蔽字個人理解,該函數和sigprocmask(0, NULL, sigset_t *set)功能一樣 sigsuspend();