linux中信号的处理,linux中关于信号处理笔记(二)
2 等待一個全局變量被設置
這種情況是等待一個信號處理程序設置一個全局變量。下面的例子用于捕捉中斷信號和退出信號,但是希望僅當退出信號處理程序時,才喚醒主進程。
#include
#include
#include
volatile sig_atomic_t quitflag;
/*
當把聲明為該類型會保證該變量在使用或賦值時, 無論是在32位還是64位的機器上都能保證操作是原子的, 它會根據機器的類型自動適應。這個類型是定義在signal.h文件中。*/
static void sig_int(int signo)
{
if(signo == SIGINT)
printf("\ninterrupt\n");
else if(signo == SIGQUIT)
quitflag = 1;//等待這個全局變量
}
int main(void)
{
sigset_t newmask, oldmask, zeromask;
if(signal(SIGINT, sig_int) == SIG_ERR)
{
printf("signal(SIGINT) error");
exit(1);
}
if(signal(SIGQUIT, sig_int) == SIG_ERR)
{
printf("signal(SIGQUIT) error");
exit(1);
}
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//屏蔽SIGQUIT信號
{
printf("SIG_BLOCK error");
exit(1);
}
while(quitflag == 0)
{
sigsuspend(&zeromask);//sigsuspend解開所有屏蔽信號,然后等待quitflag變成1,然后才往下執行,否則在這里循環
printf("quitflag = %d\n", quitflag);
}
quitflag = 0;
if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
printf("SIG_SETMASK error");
exit(1);
}
exit(0);
}
由顯示結果可以看出,sigsuspend放開屏蔽信號,按下“ctrl+C”,進入中斷,但是不設置quitflag,直到按下“ctrl+\”,quitflag置1,才往下執行。
在單進程程序當中,主進程和中斷共享變量,這不失為一種好辦法。
3 父子進程通信,關于這個只有幾個函數。在此不做記錄。
另外重點說下sigaction函數:
int sigaction(int signo, const struct sigaction *restrict act, struct *restrictoact);
這個函數用來修改或者檢查與指定信號相關聯的處理動作,其中,參數signo是要檢測或者修改其具體動作的信號編號,若act指針非空,
則要修改其動作,若oact非空,則系統由oact指針返回該信號的上一個動作。其中的結構體如下:
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int, siginfo_t *, void *);
};
關于這個函數可以這樣理解:如果sa_handler字段有效,即這個字段是一個有效信號捕捉地址,則sa_mask字段信號集是這樣的
在調用該捕捉函數前,這一信號集要加到進程的信號屏蔽字中,僅當從信號捕捉函數返回時再將進程的信號屏蔽字恢復到原來狀態
這樣,在信號處理函數調用時,就能阻塞某些信號,即在執行信號處理程序時,系統新建立的信號能被屏蔽,保證了在信號處理過程當中,
如果同一種信號再次發生,那么它會被阻塞到前一個新紅處理完畢。例如:
int main(void)
{
int i = 0;
structsigactionact, oldact;
act.sa_handler = show_handler;
...
sigaddset(&act.sa_mask, SIGQUIT);
....
sigaction(SIGINT, &act, &oldact);
while(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}}
上面函數設置SIGINT捕捉函數,在從SIGINT信號處理函數返回以前,把SIGQUIT信號屏蔽,從信號處理函數返回以后,恢復原來的信號屏蔽字。
這樣即使在信號處理過程當中產生SIGQUIT信號,在接觸屏蔽以后,信號SIGQUIT也能遞達而不丟失。
總結
以上是生活随笔為你收集整理的linux中信号的处理,linux中关于信号处理笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux monitor模式,ubun
- 下一篇: linux安装字体后wps无法打开,Ub