日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux中信号的处理,linux中关于信号处理笔记(二)

發布時間:2025/5/22 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中关于信号处理笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。