欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

[APUE]第十章 信號(hào)

系統(tǒng) 1805 0

信號(hào)概念

不存在編號(hào)為0的信號(hào)。

產(chǎn)生信號(hào)的方式:

1??????????當(dāng)用戶(hù)按某些終端鍵時(shí),引發(fā)終端產(chǎn)生信號(hào)。

2??????????硬件異常產(chǎn)生信號(hào),比如SIGSEGV信號(hào)。

3??????????進(jìn)程調(diào)用kill函數(shù)可將信號(hào)發(fā)送給另外一個(gè)進(jìn)程或者進(jìn)程組。

4??????????當(dāng)檢測(cè)到某種條件發(fā)生時(shí),并應(yīng)將其通知有關(guān)進(jìn)程時(shí)也產(chǎn)生信號(hào)。比如SIGPIPE信號(hào)。

應(yīng)用程序?qū)Ξa(chǎn)生的信號(hào)有三種方式進(jìn)行處理

1??????????忽略信號(hào)

2??????????系統(tǒng)默認(rèn)

3??????????安裝信號(hào)處理函數(shù),讓信號(hào)處理函數(shù)來(lái)處理

?

kill –l 可以查看系統(tǒng)中的信號(hào)編號(hào)

ubuntu 信號(hào)集

?

    root@LeoK:~/APUE/8_test# kill -l

 1)SIGHUP      2) SIGINT        3) SIGQUIT     4) SIGILL         5)SIGTRAP

 6)SIGABRT    7) SIGBUS       8) SIGFPE        9) SIGKILL       10)SIGUSR1

11) SIGSEGV     12)SIGUSR2     13) SIGPIPE      14) SIGALRM   15) SIGTERM

16) SIGSTKFLT  17) SIGCHLD    18) SIGCONT    19) SIGSTOP     20)SIGTSTP

21) SIGTTIN      22)SIGTTOU    23) SIGURG      24) SIGXCPU    25) SIGXFSZ

26) SIGVTALRM        27) SIGPROF     28)SIGWINCH 29) SIGIO 30) SIGPWR

31) SIGSYS        34)SIGRTMIN 35) SIGRTMIN+1      36) SIGRTMIN+2      37) SIGRTMIN+3

38) SIGRTMIN+4      39) SIGRTMIN+5      40)SIGRTMIN+6      41) SIGRTMIN+7      42) SIGRTMIN+8

43) SIGRTMIN+9      44) SIGRTMIN+10    45)SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13

48) SIGRTMIN+14    49) SIGRTMIN+15    50)SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12

53) SIGRTMAX-11    54) SIGRTMAX-10    55)SIGRTMAX-9      56) SIGRTMAX-8      57) SIGRTMAX-7

58) SIGRTMAX-6      59) SIGRTMAX-5      60)SIGRTMAX-4      61) SIGRTMAX-3      62) SIGRTMAX-2

63) SIGRTMAX-1      64) SIGRTMAX
  

?

下列情況是不產(chǎn)生core為

1進(jìn)程是設(shè)置用戶(hù)ID的,而且當(dāng)前用戶(hù)并非程序文件的所有者

2進(jìn)程是設(shè)置了組ID的,而且當(dāng)前用戶(hù)并非程序文件的所有者

3用戶(hù)沒(méi)有寫(xiě)當(dāng)前用戶(hù)的權(quán)限

4該文件太大

?

SIGPIPE信號(hào)生成

?

tips:

調(diào)用execl 子進(jìn)程的信號(hào)處理函數(shù)都會(huì)被沖掉,使信號(hào)處理函數(shù)變成默認(rèn)行為。

當(dāng)一個(gè)進(jìn)程調(diào)用fork的時(shí)候,其子進(jìn)程繼承父進(jìn)程的信號(hào)處理方式

?

?

signal信號(hào)安裝函數(shù)

?

    typedef void sig_dispose(int sig_no);

sig_dispose signal(sig_dispose func1);
  

?

其中函數(shù)地址可以指定如下宏

?

    #ifndef __ASSEMBLY__

typedef void __signalfn_t(int);

typedef __signalfn_t *__sighandler_t;

typedef void __restorefn_t(void);

typedef __restorefn_t *__sigrestore_t;

#define SIG_DFL      ((__sighandler_t)0) /* default signal handling */

#define SIG_IGN      ((__sighandler_t)1) /* ignore signal */

#define SIG_ERR      ((__sighandler_t)-1)         /* error return from signal */

#endif
  

?

不可靠信號(hào)(博客中有一篇主要講可靠信號(hào)和不可靠信號(hào)之間的區(qū)別)

?

中斷系統(tǒng)調(diào)用:

對(duì)于正在執(zhí)行低速系統(tǒng)調(diào)用的時(shí)候,收到信號(hào),那么進(jìn)程就會(huì)捕捉到這個(gè)信號(hào),中斷這個(gè)低速的系統(tǒng)調(diào)用,并且把errno設(shè)置為EINTR表示被信號(hào)中斷了。

可重入函數(shù)

不可重入函數(shù)的原因是api內(nèi)部使用了全局靜態(tài)數(shù)據(jù)結(jié)構(gòu),每一個(gè)進(jìn)程調(diào)用的時(shí)候,會(huì)寫(xiě)亂這個(gè)全局?jǐn)?shù)據(jù)結(jié)構(gòu),或者api內(nèi)部調(diào)用了malloc或者free在修改鏈表的時(shí)候。

?

可靠信號(hào)術(shù)語(yǔ)和語(yǔ)義

在信號(hào)產(chǎn)生和遞送之間的時(shí)間間隔內(nèi),稱(chēng)信號(hào)是未決的。

每一個(gè)進(jìn)程都有一個(gè)信號(hào)屏蔽字,它規(guī)定了當(dāng)前要阻塞遞送到該進(jìn)程的信號(hào)集,對(duì)于每種可能的信號(hào),該屏蔽字都有一位與之相對(duì)應(yīng),對(duì)于某種信號(hào),若其對(duì)應(yīng)位已經(jīng)被設(shè)置則他當(dāng)前是阻塞的

?

?

    int kill(pid_t pid, int signo)

int raise(int signo);
  

?

pid 為

>0 ??????????? 向進(jìn)程pid發(fā)送信號(hào)

<0????????????? 向進(jìn)程為|pid|的進(jìn)程發(fā)送信號(hào)

==0 ???????? 向調(diào)用的進(jìn)程組中的每一個(gè)進(jìn)程發(fā)送信號(hào)。而且有向這些進(jìn)程發(fā)送信號(hào)的權(quán)限。

==-1????????? 向所有進(jìn)程發(fā)送信號(hào),必須有權(quán)限。

有權(quán)限的定義是:發(fā)送者的實(shí)際或者有效用戶(hù)ID必須等于接受者的實(shí)際或者有效用戶(hù)ID

?

alarm和pause新哈皮

?

    unsigned int  alarm(unsigned int seconds);
  

?

向進(jìn)程發(fā)送SIGALRM信號(hào),其默認(rèn)動(dòng)作是終止該進(jìn)程

alarm在設(shè)置鬧鐘時(shí)間的時(shí)候,如果之前進(jìn)程設(shè)置了另外一個(gè)鬧鐘時(shí)間,那么alarm就返回之前的剩余值。

如果seconds為0表示取消以前的鬧鐘

?

?

    int pause()
  

?

pause函數(shù)使調(diào)用進(jìn)程掛起知道捕捉到一個(gè)信號(hào),只有執(zhí)行了一個(gè)信號(hào)處理程序,并從中返回,pause才會(huì)返回。

?

信號(hào)集

sigset_t 表示信號(hào)集

函數(shù)

?

    int sigemptyset(sigset_t *set);

int sigfillset(sigset_t* set);

int sigaddset(sigset_t *set, int signo);

int sigdeleteset(sigset_t* set, int signo);

int sigismember(const sigset_t* set, intsigno):
  

?

設(shè)置信號(hào)屏蔽字

?

    int sigprocmask(int how, constsigset_t  *set, sigset_t  *oset);
  

?

h ow:用于指定信號(hào)修改的方式,可能選擇有三種
SIG_BLOCK //加入信號(hào)到進(jìn)程屏蔽。
SIG_UNBLOCK //從進(jìn)程屏蔽里將信號(hào)刪除。
SIG_SETMASK //將set的值設(shè)定為新的進(jìn)程屏蔽。

?

查看當(dāng)前進(jìn)程中未決的信號(hào)

int sigpending(sigset_t *set),在set中獲取當(dāng)前進(jìn)程未決的信號(hào)集類(lèi)型

?

sigaction函數(shù)的功能是檢查或修改與指定信號(hào)相關(guān)聯(lián)的處理動(dòng)作(可同時(shí)兩種操作)。

他是POSIX的信號(hào)接口,而signal()是標(biāo)準(zhǔn)C的信號(hào)接口(如果程序必須在非POSIX系統(tǒng)上運(yùn)行,那么就應(yīng)該使用這個(gè)接口)

給信號(hào)signum設(shè)置新的信號(hào)處理函數(shù)act,同時(shí)保留該信號(hào)原有的信號(hào)處理函數(shù)oldact

int?sigaction(int?signo,const?struct?sigaction?*restrict act,

??????????????struct?sigaction?*restrict oact);

結(jié)構(gòu)sigaction定義如下:

struct?sigaction{
??void?(*sa_handler)(int);
?? sigset_t sa_mask;
??int?sa_flag;
??void?(*sa_sigaction)(int,siginfo_t?*,void?*);
};

sa_handler字段包含一個(gè)信號(hào)捕捉函數(shù)的地址

sa_mask字段說(shuō)明了一個(gè)信號(hào)集,在調(diào)用該信號(hào)捕捉函數(shù)之前,這一信號(hào)集要加進(jìn)進(jìn)程的信號(hào)屏蔽字中。僅當(dāng)從信號(hào)捕捉函數(shù)返回時(shí)再將進(jìn)程的信號(hào)屏蔽字復(fù)位為原先值。

sa_flag是一個(gè)選項(xiàng),主要理解兩個(gè)

SA_INTERRUPT 由此信號(hào)中斷的系統(tǒng)調(diào)用不會(huì)自動(dòng)重啟
SA_RESTART 由此信號(hào)中斷的系統(tǒng)調(diào)用會(huì)自動(dòng)重啟

SA_SIGINFO 提供附加信息,一個(gè)指向siginfo結(jié)構(gòu)的指針以及一個(gè)指向進(jìn)程上下文標(biāo)識(shí)符的指針

?

?

sigsetjmp和siglongjmp

1. 原型 :

?

    #include <setjmp.h>

int sigsetjmp(sigjmp_buf env, int savemask);
  

直接調(diào)用則返回0,?從siglongjmp調(diào)用返回則返回非0值.
void?siglongjmp(sigjmp_buf?env,?int?val);

?

可見(jiàn)發(fā)現(xiàn)sigsetjmp比setjmp多了一個(gè)參數(shù)savemask, 如果非0, 則sigsetjmp在env中保存進(jìn)程的當(dāng)前信號(hào)屏蔽字

?

sigsuspend函數(shù)

?

          #include <signal.h>

       int sigsuspend(const sigset_t *sigmask)
  

?

也就是說(shuō), sigsuspend后,進(jìn)程就掛在那里,等待著開(kāi)放的信號(hào)的喚醒 。系統(tǒng)在接受到信號(hào)后,馬上就把現(xiàn)在的信號(hào)集還原為原來(lái)的,然后調(diào)用處理函數(shù)。

?

void abot()函數(shù)向進(jìn)程發(fā)送SIGABRT信號(hào)

[APUE]第十章 信號(hào)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 精品一区二区久久久久久久网站 | 国产欧美精品一区二区三区 | 成人免费视频观看视频 | 日本精a在线观看 | 亚洲国产一区二区三区四区 | 日韩在线aⅴ免费视频 | 小明www永久免费播放平台 | 综合网视频 | 天天爽天天草 | 波多野结衣在线网址 | 亚洲天堂网在线观看 | 国产精品成人第一区 | 久久久日韩精品一区二区 | 欧美一级片免费看 | 男女午夜| 欧美日韩一区二区不卡 | 日本黄色大片免费 | 久久3| 成人黄色免费电影 | 日本www视频在线观看 | 国产亚洲精彩视频 | 久综合网 | 亚洲成av人片在线观看 | 日本一区二区久久久 | 亚洲精品第一国产综合高清 | 91网页视频入口在线观看 | 色亚洲色图 | av在线成人 | 日韩av电影在线播放 | 午夜成人在线视频 | 国产精品网址 | 全黄性性激高免费视频 | 麻豆视频秘密入口 | 扒开双腿进入做爰视频 | 激情九月婷婷 | 国产成人在线视频 | chengrenzaixian| 精品久久中文字幕 | 成人爽a毛片免费啪啪红桃视频 | 91精品国产欧美一区二区 | 91免费国产在线 |