訊號導致的問題
不是任何訊號我們都需要的,如果遇到我們不想處理的訊號,我們怎麼避免這個訊號?
1.訊號遮蔽
intsigprocmask(int how,//操作方式
sig_block遮蔽訊號
sig_unblock剪除遮蔽訊號
sig_setmask修改遮蔽訊號
constsigset_t *sigs,//操作的訊號集合
sigset_t*oldsigs);//返回原來操作的訊號集合
返回值:執行成功返回0,失敗返回-1。
遮蔽訊號的步驟:
1.宣告訊號集
sigset_t sigs;
2.加入遮蔽訊號
一組訊號集合維護函式
2.1. 清空集合sigemptyset
int sigemptyset( sigset_t *set);
2.2. 新增訊號到集合sigaddset
int sigaddset( sigset_t *set ,int signum);
2.3. 從集合刪除訊號sigdelset
int sigdelset(sigset_t *set,int signum);
2.4. 新增所有訊號到集合sigfillset
int sigfillset( sigset_t*set);
2.5.判定訊號是否在集合sigismember
int sigismember(const sigset_t *set ,int signum);
3.遮蔽訊號
4.接觸遮蔽
例子:#include
#include
void main()
int sum=0;
//宣告訊號集
sigset_t sigs;
//清空訊號集
sigemptyset(&sigs);
//新增訊號到訊號集
sigaddset(&sigs,sigint); //
//遮蔽訊號
sigprocmask( sig_block,&sigs,0);
for(i=1;i<=10;i++)
sum+=i;
sleep(1);
printf(「sum=%d\n」,sum);
//撿出遮蔽
sigprocmask(sig_unblock,&sigs,0);//撿出遮蔽,訊號立即觸犯,列印over不能//執行,如果沒有撿出遮蔽訊號,over正常列印
printf(「over!\n」);
說明:當遮蔽了某個訊號,這個訊號將不會觸發,直到我們撿出了該訊號,訊號才會觸發。
2.查詢被遮蔽的訊號
intsigpending(sigset_t *sets); 返回0成功,-1失敗
例子:#include
#include
void main()
int sum=0;
//宣告訊號集
sigset_t sigs;
sigset_t sigp;
//清空訊號集
sigemptyset(&sigs);
//新增訊號到訊號集
sigaddset(&sigs,sigint); //
//遮蔽訊號
sigprocmask( sig_block,&sigs,0);
for(i=1;i<=10;i++)
sum+=i;
sigpending(&sigp);//得到遮蔽的訊號
if(sigismemeber(&sigp,sigint))
printf(「訊號sigint在排隊\n」);
sleep(1);
printf(「sum=%d\n」,sum);
//撿出遮蔽
sigprocmask(sig_unblock,&sigs,0);
printf(「over!\n」);
2.訊號遮蔽的切換
int sigsuspend(sigset_t *sigs);
遮蔽新的訊號,原來的訊號失效.
sigsuspend是阻塞函式.對引數訊號遮蔽.
對引數沒有指定的訊號不遮蔽,但當沒有遮蔽訊號處理函式呼叫完畢
sigsuspend返回條件:
1.訊號發生,並且訊號是非遮蔽訊號
2.訊號必須要處理,而且處理函式返回後,sigsuspend才返回.
sigsuspend設定新的遮蔽訊號,儲存舊的遮蔽訊號
而且當sigsuspend返回的時候,恢復舊的遮蔽訊號.
函式sigsuspend將程序的訊號遮蔽碼設定為sigs,然後與pause()函式一樣等待訊號的發生並執行完訊號處理函式。訊號處理函式執行完後再把程序的訊號遮蔽碼設定為原來的遮蔽字,然後sigsuspend函式才返回。sigsuspend總是返回-1。
例子:#include
#include
#include
void deal()
printf(「處理訊號sigint\n」);
void main()
signal(sigint,deal);
int sum=0;
//宣告訊號集
sigset_t sigs;
sigset_t sigp;
sigset_t newsig=null;
//清空訊號集
sigemptyset(&sigs);
//新增訊號到訊號集
sigaddset(&sigs,sigint); //
//遮蔽訊號
sigprocmask( sig_block,&sigs,0);
for(i=1;i<=10;i++)
sum+=i;
sigpending(&sigp);//得到遮蔽的訊號
if(sigismemeber(&sigp,sigint))
printf(「訊號sigint在排隊\n」);
sigsuspend(&newsig);//切換遮蔽訊號,等待sigint訊號,並呼叫處//理函式後函式返回。
sleep(1);
printf(「sum=%d\n」,sum);
說明:程式檢查到遮蔽訊號中有sigint訊號在排隊,就呼叫sigsuspend函式切換遮蔽訊號,程式處理sigint訊號後,sigsuspend函式才返回。
訊號遮蔽的切換的理解sigsuspend
include include include include void handle int s main printf 所有電影拷貝完畢 n sum printf over n sigprocmask sig unblock,sigs,0 sigsuspend sigset t sigs 功能 ...
Linux C 訊號 訊號量
july 10,2020 12 49 am signal sighup,sig ign signal訊號函式,第乙個引數表示需要處理的訊號值 sighup 第二個引數為處理函式或者是乙個表示,這裡,sig ign表示忽略sighup那個註冊的訊號。sighup和控制台操作有關,當控制台被關閉時系統會...
訊號遮蔽字
訊號遮蔽字是指乙個程序中當前阻塞而不能夠遞送給該程序的訊號集。訊號集則是乙個能表示多個訊號的集合的一種資料型別,為sigset t。與訊號集設定相關的函式有如下幾個 cpp view plain copy font size 18px include 下列四個函式成功返回0,出錯返回 1 int s...