第 7 章 Linux信號(hào)電子課件_第1頁
第 7 章 Linux信號(hào)電子課件_第2頁
第 7 章 Linux信號(hào)電子課件_第3頁
第 7 章 Linux信號(hào)電子課件_第4頁
第 7 章 Linux信號(hào)電子課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第7章Linux信號(hào)內(nèi)容提要信號(hào)概述Linux系統(tǒng)中的信號(hào)信號(hào)的定義發(fā)送信號(hào)信號(hào)文件7.1信號(hào)概述信號(hào)概述

信號(hào)是進(jìn)程對(duì)所發(fā)生事件的一種響應(yīng)模式,例如,數(shù)據(jù)溢出和定時(shí)器到期等,內(nèi)核預(yù)設(shè)了多種事件,為它們定義了相應(yīng)的信號(hào),并設(shè)置了對(duì)應(yīng)的信號(hào)處理方式;當(dāng)事件發(fā)生時(shí),進(jìn)程會(huì)收到相應(yīng)的信號(hào),進(jìn)程暫停運(yùn)行,轉(zhuǎn)而執(zhí)行對(duì)應(yīng)的信號(hào)處理程序,待信號(hào)處理完成,進(jìn)程從中斷點(diǎn)恢復(fù)運(yùn)行。通常,信號(hào)的發(fā)生具有異步性,它可能發(fā)生在進(jìn)程運(yùn)行過程中的任意時(shí)間點(diǎn),所以,信號(hào)也稱為一步信號(hào)。信號(hào)和中斷在概念上具有相似性,信號(hào)屬于操作系統(tǒng)的范疇,而中斷屬于處理器對(duì)外部設(shè)備事件的響應(yīng)方式。應(yīng)用編程接口分類API功能描述信號(hào)處理sigprocmask修改當(dāng)前進(jìn)程的信號(hào)掩碼sigaction定義信號(hào)的處理方式sigpending檢測(cè)到達(dá)的阻塞信號(hào)sigwaitinfo等待阻塞信號(hào)的到達(dá)發(fā)送信號(hào)kill向進(jìn)程發(fā)送信號(hào)abort向進(jìn)程發(fā)送SIGABRT信號(hào)sigqueue發(fā)送實(shí)時(shí)信號(hào)信號(hào)文件signalfd創(chuàng)建信號(hào)文件7.2Linux系統(tǒng)中的信號(hào)信號(hào)的分類標(biāo)準(zhǔn)信號(hào)標(biāo)準(zhǔn)信號(hào)源自Unix,信號(hào)編號(hào)以正整數(shù)表示,范圍從1至31,內(nèi)核僅用一位表示標(biāo)準(zhǔn)信號(hào),當(dāng)值為0,表示該位對(duì)應(yīng)的信號(hào)未發(fā)生,若值為1,表示該位對(duì)應(yīng)的信號(hào)已發(fā)生。實(shí)際時(shí)信號(hào)為彌補(bǔ)標(biāo)準(zhǔn)信號(hào)的某些不足,引入了實(shí)時(shí)信號(hào),信號(hào)編號(hào)從32至64,每個(gè)實(shí)時(shí)信號(hào)在內(nèi)核中用隊(duì)列表示,支持排隊(duì)和參數(shù)傳遞。信號(hào)編號(hào)值動(dòng)作含義SIGHUP1Term與終端的連接斷開SIGINT2Term終端中斷SIGQUIT3Core終端退出SIGILL4Core非法指令SIGABRT6Core中止進(jìn)程SIGFPE8Core浮點(diǎn)異常SIGKILL9Term殺死進(jìn)程(不可屏蔽)SIGSEGV11Core段非法錯(cuò)誤SIGPIPE13Term管道讀寫錯(cuò)誤SIGALRM14Term實(shí)時(shí)計(jì)時(shí)器到期SIGTERM15Term終止進(jìn)程SIGUSR130,10,16Term用戶自定義信號(hào)SIGUSR231,12,17Term用戶自定義信號(hào)SIGCHLD20,17,18Ign告知父進(jìn)程,子進(jìn)程終止SIGCONT19,18,25Cont若停止則繼續(xù)SIGSTOP17,19,23Stop停止進(jìn)程(不可屏蔽)SIGTSTP18,20,24Stop終端停止SIGTTIN21,21,26Stop后臺(tái)進(jìn)程從終端讀取標(biāo)準(zhǔn)信號(hào)信號(hào)編號(hào)值動(dòng)作含義SIGTTOU22,22,27Stop后臺(tái)進(jìn)程向終端寫SIGBUS10,7,10Core總線錯(cuò)誤SIGPROF27,27,29Term實(shí)用計(jì)時(shí)器到期SIGSYS12,31,12Core無效的系統(tǒng)調(diào)用SIGTRAP5Core跟蹤/斷點(diǎn)陷阱SIGURG16,23,21Ign套接字上的緊急數(shù)據(jù)SIGVTALRM26,26,28Term虛擬計(jì)時(shí)器到期SIGXCPU24,24,30CoreCPU時(shí)間限制超時(shí)SIGXFSZ25,25,31Core超過文件最大長度限制SIGIOT6Core與SIGABRT信號(hào)同義SIGEMT7,-,7Term模擬陷入SIGSTKFLT-,16,-Term協(xié)處理器錯(cuò)誤SIGIO23,29,22TermI/O可能產(chǎn)生SIGCLD-,-,18Ign與SIGCHLD信號(hào)同義SIGPWR29,30,19Term電量即將耗盡SIGINFO29,-,-與SIGPWR信號(hào)同義SIGLOST-,-,-Term文件鎖丟失(未使用)SIGWINCH28,28,20Ign終端窗口尺寸發(fā)生變化SIGUNUSED-,31,-CoreSIGSYS信號(hào)同義標(biāo)準(zhǔn)信號(hào)(續(xù))動(dòng)作類型含義Term結(jié)束進(jìn)程Ign忽略信號(hào)Core結(jié)束進(jìn)程并產(chǎn)生核心文件Stop暫停進(jìn)程運(yùn)行Cont恢復(fù)暫停進(jìn)程的運(yùn)行Linux信號(hào)的產(chǎn)生1.用戶信號(hào)在用戶與系統(tǒng)交互過程中產(chǎn)生,例如,當(dāng)用戶在鍵盤上輸入Ctrl+C和Ctrl+\時(shí),終端驅(qū)動(dòng)程序通知內(nèi)核將向目標(biāo)進(jìn)程發(fā)送信號(hào)SIGINT和SIGQUIT。2.內(nèi)核內(nèi)核在執(zhí)行過程中產(chǎn)生,例如,異步I/O模式下,I/O狀態(tài)就緒,內(nèi)核向目標(biāo)進(jìn)程發(fā)送相應(yīng)的信號(hào)SIGIO。3.進(jìn)程一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送信號(hào),例如,進(jìn)程通過調(diào)用kill函數(shù)向其他進(jìn)程發(fā)送信號(hào)。信號(hào)的處理方式1.異步處理模式默認(rèn)情況下,信號(hào)采用異步處理模式,信號(hào)可能發(fā)生在進(jìn)程運(yùn)行的任意時(shí)刻,當(dāng)信號(hào)發(fā)生時(shí),進(jìn)程暫停運(yùn)行,保存現(xiàn)場(chǎng),轉(zhuǎn)而執(zhí)行信號(hào)處理程序,待信號(hào)處理程序執(zhí)行完畢,恢復(fù)現(xiàn)場(chǎng),從中斷點(diǎn)繼續(xù)運(yùn)行。2.同步處理模式當(dāng)信號(hào)被阻塞時(shí),到達(dá)的信號(hào)不會(huì)馬上處理,而是處于等待狀態(tài),進(jìn)程可自主選擇時(shí)機(jī)進(jìn)行處理。信號(hào)的接收對(duì)象

在多線程環(huán)境下,線程共享進(jìn)程的信號(hào)處理方式,但信號(hào)掩碼各自獨(dú)立,線程可屏蔽各自不感興趣的信號(hào),信號(hào)的發(fā)送目標(biāo)可為進(jìn)程或線程,當(dāng)目標(biāo)為進(jìn)程時(shí),進(jìn)程中的線程均有機(jī)會(huì)處理到達(dá)的信號(hào),機(jī)會(huì)取決于進(jìn)程調(diào)度,當(dāng)目標(biāo)為線程時(shí),由接收信號(hào)的線程處理。信號(hào)的延遲

信號(hào)除因阻塞而被延遲處理外,在未阻塞的情況下,從信號(hào)的產(chǎn)生到處理,可能存在一定的延遲,信號(hào)處理取決于下一個(gè)調(diào)度時(shí)機(jī),例如,時(shí)間片耗盡后重新被選中、系統(tǒng)調(diào)用結(jié)束和中斷返回。7.3信號(hào)的定義信號(hào)掩碼

信號(hào)掩碼是由一組信號(hào)構(gòu)成的集合,當(dāng)屬于該集合的信號(hào)到達(dá)進(jìn)程時(shí),對(duì)信號(hào)不作任何處理,直至信號(hào)阻塞被解除,期間一直處于等待狀態(tài)。設(shè)置信號(hào)掩碼頭文件

#include<signal.h>函數(shù)原型

int

sigprocmask(inthow,constsigset_t*set,sigset_t*oldset);功能 重置進(jìn)程的信號(hào)掩碼。參數(shù)

how:操作方式。

set:新信號(hào)集。

oldset:替換的信號(hào)掩碼。返回值 成功,返回0,失敗,返回-1。信號(hào)處理的定義sigaction(1/3)頭文件

#include<signal.h>函數(shù)原型

int

sigaction(int

signum,conststruct

sigaction*act,struct

sigaction*oldact);功能 定義信號(hào)的行為。參數(shù)

signum:信號(hào)編號(hào)。

act:信號(hào)的處理方式。

oldact:原信號(hào)的處理方式。返回值 成功返回0,失敗返回-1。信號(hào)處理的定義sigaction(2/3)

struct

sigaction{ //信號(hào)處理函數(shù)

void(*sa_handler)(int); //攜帶更多參數(shù)的信號(hào)處理函數(shù)

void(*sa_sigaction)(int,siginfo_t*,void*); //信號(hào)處理期間的信號(hào)掩碼

sigset_t

sa_mask; //信號(hào)處理的更多特性

int

sa_flags; //glibc內(nèi)部使用

void(*sa_restorer)(void);};信號(hào)處理的定義sigaction(3/3)siginfo_t{

int

si_signo;//信號(hào)編號(hào)

int

si_errno;//錯(cuò)誤值

int

si_code;//信號(hào)來源的詳細(xì)信息

pid_t

si_pid;//進(jìn)程ID

uid_t

si_uid;//進(jìn)程所屬實(shí)際用戶ID

int

si_status;//進(jìn)程的結(jié)束狀態(tài)

clock_t

si_utime;//進(jìn)程消耗的用戶時(shí)間

clock_t

si_stime;//進(jìn)程消耗的系統(tǒng)時(shí)間

sigval_t

si_value;//信號(hào)傳遞的參數(shù)

int

si_overrun;//定時(shí)器溢出次數(shù)

int

si_timerid;//POSIX.1b定時(shí)器IDvoid*si_addr;//產(chǎn)生異常的地址

longsi_band;//I/O事件關(guān)聯(lián)的事件值

int

si_fd;//與I/O事件相關(guān)的文件描述符...}實(shí)例分析voidhandler(int

signum){

printf("\nSIGINT

cought\n\n");}main(){

struct

sigactionact;

sigfillset(&(act.sa_mask));

act.sa_handler=handler;

sigaction(SIGINT,&act,NULL); pause()

printf("pausereturn\n",);}

到達(dá)的阻塞信號(hào)

當(dāng)位于信號(hào)掩碼的信號(hào)到達(dá)進(jìn)程時(shí),信號(hào)被阻塞,直至阻塞解除,期間信號(hào)處于阻塞狀態(tài)。可分別通過sigpending和sigwaitinfo函數(shù)檢測(cè)到達(dá)的阻塞信號(hào)和同步等待排隊(duì)的信號(hào)。sigpending函數(shù)頭文件

#include<signal.h>函數(shù)原型

int

sigpending(sigset_t*set);功能 檢測(cè)到達(dá)的阻塞信號(hào)。參數(shù)

Set:指向到達(dá)的阻塞信號(hào)。返回值 成功,返回0,失敗,返回-1。sigwaitinfo函數(shù)頭文件

#include<signal.h>函數(shù)原型

int

sigwaitinfo(const

sigset_t*set,siginfo_t*info);功能 等待阻塞信號(hào)的到達(dá)。參數(shù)

set:等待的阻塞信號(hào)。

info:到達(dá)的阻塞信號(hào)。返回值 成功,返回0,失敗,返回-1。

實(shí)例分析int

main(int

argc,char*argv[])

sigset_tset;

sigfillset(&set);

sigprocmask(SIG_SETMASK,&set,NULL); sleep(atol(argv[1])); for(;;){

siginfo_t

si;

int

sig=sigwaitinfo(&set,&si); if((sig==-1)||(sig==SIGINT||sig==SIGTERM)){

printf("sigwaitinfofailed|SIGINT|SIGTERM\n"); exit(0); }

printf("getsignal:%d\t%s\n",sig,strsignal(sig));

printf("si_signo=%d,si_code=%d(%s),si_value=%d\n",

si.si_signo,si.si_code, (si.si_code==SI_USER)?"SI_USER": (si.si_code==SI_QUEUE)?"SI_QUEUE":"other",

si.si_value.sival_int);

printf("si_pid=%ld\tsi_uid=%ld\n",(long)si.si_pid,(long)si.si_uid); }}7.4發(fā)送信號(hào)發(fā)送標(biāo)準(zhǔn)信號(hào)頭文件

#include<sys/types.h #include<signal.h>函數(shù)原型

int

kill(pid_t

pid,int

sig);;功能 向進(jìn)程發(fā)送信號(hào)。參數(shù)

pid:進(jìn)程ID。

sig:信號(hào)編號(hào)。返回值 調(diào)用成功返回0,否則返回-1。參數(shù)pid含義pd>0目標(biāo)進(jìn)程的ID為pidpid=0調(diào)用者進(jìn)程所屬組中的所有進(jìn)程pid=-1除初始化進(jìn)程init外,有權(quán)發(fā)送的所有進(jìn)程pid<-1進(jìn)程組ID為-pid的所有進(jìn)程發(fā)送實(shí)時(shí)信號(hào)sigqueue函數(shù)頭文件

#include<sys/types.h> #include<signal.h>函數(shù)原型

int

sigqueue(pid_t

pid,int

sig,constunionsigval

val);功能 向進(jìn)程發(fā)送實(shí)時(shí)信號(hào)。參數(shù)

pid:目標(biāo)進(jìn)程ID。

sig:實(shí)時(shí)信號(hào)編號(hào)。

val:傳遞的參數(shù)。返回值 成功返回0;失敗返回-1。發(fā)送實(shí)時(shí)信號(hào)

sigqueue函數(shù)向進(jìn)程pid發(fā)送實(shí)時(shí)新號(hào)sig,并攜帶參數(shù)val,val為sigval類型指針,sigval類型的定義如下。typedefunionsigval{

int

sival_int; //用于傳送一個(gè)整型數(shù)

void*sival_ptr; //指向參數(shù)地址

}sigval_t;

sigqueue函數(shù)基于rt_sigqueueinfo系統(tǒng)調(diào)用實(shí)現(xiàn),接收實(shí)時(shí)信號(hào)的進(jìn)程需通過sigaction函數(shù)的SA_SIGINFO選項(xiàng)定義信號(hào)處理函數(shù),以便接收信號(hào)和攜帶的數(shù)據(jù)。7.5信號(hào)文件信號(hào)文件

信號(hào)文件是一種將到達(dá)的信號(hào)作為字節(jié)流的特殊文件。

Linux內(nèi)核自2.6.22引入了一種非標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口eventfd、signalfd和timerfd,它們將事件、信號(hào)和到期時(shí)間抽象為字節(jié)流,其中signalfd便是信號(hào)文件的應(yīng)用編程接口。信號(hào)文件signalfd函數(shù)頭文件

#include<sys/signalfd.h>函數(shù)原型

int

signalfd(int

fd,constsigset_t*mask,intflags);功能 創(chuàng)建信號(hào)文件。參數(shù)

fd:文件描述符。

mask:監(jiān)聽的信號(hào)集。

flags:打開方式。返回值 成功:返回文件描述符,失敗,返回-1。信號(hào)文件(續(xù))struct

signalfd_siginfo{uint32_tssi_signo;//信號(hào)編號(hào)

int32_tssi_errno;//錯(cuò)誤碼(未使用

int32_tssi_code;//信號(hào)碼

uint32_tssi_pid;//發(fā)送進(jìn)程IDuint32_tssi_uid;//發(fā)送用戶實(shí)際IDint32_tssi_fd;//文件描述符(SIGIO)uint32_tssi_tid;//內(nèi)核定時(shí)器IDuint32_tssi_band;//I/O事件(SIGIO)*/......uint8_tpad[X];//擴(kuò)充成員變量};參數(shù)flags

含義SFD_NONBLOCK非阻塞方式讀寫文件SFD_CLOEXEC設(shè)置close-on-exec選項(xiàng)signalfd函數(shù)中參數(shù)flags的定義實(shí)例分析int

main(int

argc,char*argv[]){

sigset_tmask;

sigemptyset(&mask);

sigaddset(&mask,SIGQUIT);

sigaddset(&mask,SIGUSR1);

sigprocmask(SIG_BLOCK,&mask,NULL);

int

sfd=signalfd(-1,&mask,0); for(;;){

struct

signalfd_siginfo

fdsi;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論