青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 1  文章 - 0  trackbacks - 0
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

  •  

最新評論

信號是傳送給進程的一種事件通知,生成信號的事件有三大類:

1.       程序錯誤:除零,非法內存訪問

2.       外部信號:終端Ctrl-C產生SGINT信號,定時器到期產生SIGALRM…

3.       顯示請求:kill函數允許進程發送任何信號給其他進程或進程組。

信號生成既可以是同步的(信號與程序中的某個具體操作相關并在那個操作同時產生),也可以是異步的。通常程序錯誤生成信號為同步的,進程顯式請求給自己的信號也是同步的。

外部事件總是異步的,來自其他進程的顯示請求也是異步的。

信號發生時,我們可以告訴unix內核采取下面三種動作中的任一種:

1.       忽略信號:大部分信號可被忽略,除SIGSTOPSIGKILL信號外(這是超級用戶殺掉或停掉任意進程的手段)。

2.       捕獲信號:注冊信號處理函數,它對產生的特定信號做處理。

3.       讓信號默認動作起作用:unix內核定義的默認動作,有5種情況:

a)         流產abort:終止進程并產生core文件。

b)        終止stop:終止進程但不生成core文件。

c)         忽略:忽略信號。

d)        掛起suspend:掛起進程。

e)         繼續continue:若進程是掛起的,則resume進程,否則忽略此信號。

任意時刻,進程可以為信號指定動作。

信號處理涉及兩個過程,生成與交付。

信號生成出現在事件發生時,此時內核檢查接收進程的相關數據結構,此結構中記錄了信號的布局,懸掛信號集和處理動作。如果信號是要被忽略的,內核不做任何動作就返回。否則,將此信號加入懸掛信號集合中。(懸掛信號集合通常用位串表示,每位對應一個信號,內核無法記錄同一信號的多個實例)。

       如果進程處于可中斷的睡眠狀態,并且該信號非阻塞,內核喚醒進程。被喚醒進程一旦運行則在返回用戶態前優先處理懸掛信號,當有懸掛信號并且非阻塞時,內核查看是否有處理句柄,如果沒有注冊句柄,則采取默認動作(通常為終止進程)。如果有句柄,則將此信號加入阻塞信號屏蔽中。

       最后內核安排進程返回到用戶態并執行信號句柄,同時保證句柄執行完時,進程從被中斷處代碼執行。

       由異步事件產生的信號可能在任一條指令后發生,當信號句柄完成時,進程從中斷之處起執行。如果信號是在進程處于系統調用期間到達的,內核通常abort此系統調用并返回錯誤碼EINTR

       進程可以有選擇的阻塞信號交付,當一個被阻塞的信號生成時,如果進程指定的動作為默認或者捕獲,則此信號一直懸掛于該進程直到對此信號的阻塞放開,或者信號動作改為忽略。 系統對阻塞信號的判定是在信號交付時而非生成時,這樣可以允許進程在信號被交付前改變信號動作。

       每個進程有一個阻塞信號屏蔽,它定義當前被阻塞交付的那些信號。可認為它是一個位串,每位對應一個信號。如果某信號對應的位被設置,則該信號當前阻塞,進程可調用

sigprocmask函數來檢查或設置屏蔽。


 

程序錯誤類信號:默認動作使進程流產,產生core文件。

SIGABRT   調用abort函數生成的信號。

SIGFPE      浮點計算錯誤。

SIGILL      非法指令錯誤。

SIGBUS/SIGSEGV 硬件錯誤-非法地址訪問。

SIGEMT    硬件錯誤

SIGSYS:       非法系統調用。

SIGTRAP   硬件錯誤(通常為斷點指令)。

 

程序終止類信號:默認動作使進程終止,我們通常要處理這類信號,做一些清理工作,句柄函數應在結束時為此信號指定默認動作,然后再次生成該信號,使得程序終止。

SIGHUP:終端斷開連接時,生成此信號給控制進程。

SIGINTCtrl-CDelete按下時,由終端驅動生成,并發送給前臺進程組中的所有進程。

SIGKILL:使程序立即終止,不能被捕獲或忽略,也不能被阻塞。

SIGQUITCtrl-\,SIGINT,并且產生core

SIGTERM:該信號使程序終止,但是可以阻塞、捕獲、忽略。

 

鬧鐘類信號:通知定時器到期,默認動作是終止程序,但通常會設置句柄。

SIGALRMalarm/setitimer函數設置定時到期后,會產生此信號。

SIGPROF

SIGVTALRM

 

I/O類信號:通知進程在描述字上發生了感興趣事件,支持信號驅動IO

SIGIO fd準備執行輸入輸出時發送此信號。

SIGPOLL:異步I/O信號。

SIGURG:網絡收到帶外數據時可選擇生成此信號。

 

作業控制類信號:

SIGCHLD   進程終止或停止時會向其父進程發送該信號,默認動作為忽略。

SIGCONT:     使停止的進程恢復運行。

SIGSTOP:      停止進程。

SIGTSTP/SIGTTIN/SIGTTOU:

 

操作錯誤類信號:默認動作終止程序。

SIGPIPE    管道破裂。

SIGXCPU/SIGXFSZ

 

signal函數:

void (* signal(int sig, void (*func)(int)))(int);

sig指明是哪一種信號。

func指明動作:SIG_DFL SIG_IGN,或者信號句柄地址。

當信號發生時,如果func指向信號句柄,系統在將控制轉往句柄前,先將該信號動作置為DFL,或者阻塞該信號直到句柄完成。

Signal函數返回值指向前一次有效動作指針:SIG_DFL,SIG_IGN,或信號地址,這提供了恢復信號動作的機制。 如果signal調用出錯,返回SIG_ERR并設置errno

 

進程初啟時的信號動作:

fork:繼承父進程的動作

exec:所有信號動作要么是忽略要么是默認。

 

不可靠信號:

早期版本Unix中使用signal,每當信號交付時,其動作總是由系統重置為默認動作,因此為了使信號句柄執行期間,仍能對同一信號后續做反應,需要再次調用signal

Catch_Signal(){

       // 如果第二次信號剛好在此時發生,將導致進程終止core掉。

       signal(SIGQUIT,Catch_Signal);

}

Main(){                   

       signal(SIGQUIT, Catch_Signal);

      

}

使用signal的另一個問題是,對于信號,進程要么忽略,要么捕獲,無法在一段時間內阻塞信號(推遲信號的交付),為了克服signal兼容性問題,現代unix均實現了POSIX定義的sigaction函數,該函數采用一個sigaction結構,除定義信號交付時要采取的動作外,還包含其他一些動作控制信息。

sigaction還允許調用進程檢測或指定與特定信號相關的動作。

int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);

sig指定信號-SIGKILLSIGSTOP

如果actNULL,則不改變信號動作,只查詢當前動作。

成功返回0,失敗則不安裝新信號動作,返回-1,設置errno

struct sigaction{

       void *sa_handler(int);                        // signal的第二參數func          

       void (*sa_sigaction)(int, siginfo_t*, void*); // 僅當flags設置SA_SIGINFO起作用。

       sigset_t sa_mask;    // 指明信號執行期間要阻塞的一組信號,除此之外導致信號句柄執

行的信號也自動阻塞,除非指定了SA_NODEFER。信號句柄正常返回時,屏蔽恢復到原先狀態。          

       int sa_flags;           //

}

sa_flags是一個位串,可以通過或運算生成。可設置下列標志:

SA_NOCLDSTOP: 只對CHLD信號起作用,子進程暫停時不發信號給父進程。

SA_RESTART: 信號句柄返回時,自動恢復被該信號中斷的系統調用。否則該系統調用將中斷返回-1,并設置errnoEINTR

SA_ONSTACK:

SA_RESETHAND:信號句柄入口,系統將重置信號動作為SIG_DFL.

SA_NODEFER:句柄執行期間,不自動阻塞該信號。

SA_NOCLDWAIT:只對CHLD起作用,調用進程的所有子進程在終止時不會成為Zombe。這種情況下,父進程無需要wait子進程,并且子進程終止也不向父進程發SIGCHLD信號。

如果父進程調用wait,將阻塞到所有子進程終止,并返回-1errno設為ECHILD.

SA_SIGINFO:如果未設置此標志,則信號句柄原型為:

 void func(int signo);

如果設置此標志,則句柄原型為:

void func(int signo, singinfo_t* info, void* context);

Info- 解釋信號生成的原因。

Context-信號被交付時所中斷進程的上下文。

一旦用sigaction為特定信號建立了動作,該動作就一直保持,直到另一次調用sigaction,或者調用exec,或者因設置了SA_RESETHAND導致系統自動改變動作為默認為止。

 

除了外部中斷產生信號外,程序可以顯式的調用raise函數給他自己發送信號,或調用kill向自己或其他進程發送信號。

 

阻塞信號意味著保持該信號并推遲它的交付,可以防止程序中的關鍵代碼被信號中斷。

信號集操作:

int sigemptyset(sigset_t* set); // 清空信號集

int sigfillset(sigset_t* set);   // 包含所有信號集

sigaddset/sigdelset/sigismember;

sigprocmask用來檢測或改變調用進程的信號屏蔽。

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

How: SIGBLOCK SIG_UNBLOCK   SIG_SETMASK

如果調用sigprocmask放開某個信號而導致任何懸掛信號被解除阻塞,則函數返回前,這些信號中至少有一個被交付。

檢查懸掛信號:int sigpending(sigset_t* set);

等待信號:int pause(void);

懸掛調用進程直到有一個信號到達。僅當句柄執行并返回時,pause函數才返回:此時返回-1,并設置errnoEINTR。所有其他情況下pause不返回。

 

如果多個相同信號在信號句柄運行前發給了進程,則句柄只被運行一次。換句話說,默認情況下unix信號是非排隊的,只有當實現支持實時信號并且sa_flags設置SA_SIGINFO時,由sigqueue生成的后續信號才排隊。

 

I/O執行期間,有可能到達信號,此時有兩種情況:重新開始系統調用還是返回失敗.

早期unix特征為,進程執行慢系統調用期間捕獲信號時,該調用被中斷并設置errnoEINTR。現代unix增加了sa_flags選項SA_RESTART可對單個信號要求自動恢復被中斷的系統調用。

原則如下:如果進程阻塞于慢系統調用,并且進程捕獲信號且該信號句柄返回,系統調用可能返回EINTR 雖然有些unix能自動恢復系統調用,但是為了兼容性,我們必須準備慢系統調用返回EINTR,當檢測到EINTR,要么重新開始系統調用,要么做其他處理。

Again

       if (n=read(fd,buff, BUFSIZE) < 0) {

              if (errno ==EINTR)

                     goto Again;

              else

                     …}

posted on 2008-06-30 09:19 powervv 閱讀(3406) 評論(0)  編輯 收藏 引用 所屬分類: linux

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            夜夜嗨av一区二区三区四区| 欧美专区日韩视频| 欧美性感一类影片在线播放| 欧美精品九九| 欧美精品一区二区三区久久久竹菊 | 欧美 日韩 国产 一区| 久久久久一区| 欧美在线黄色| 男女av一区三区二区色多| 欧美精品一区二区精品网| 国产精品av免费在线观看| 国产日韩精品久久久| 在线观看一区| 一区二区电影免费在线观看| 亚洲欧美一区二区在线观看| 久久久久久伊人| 亚洲国产综合视频在线观看| 亚洲黄色高清| 午夜精品在线观看| 欧美成人亚洲| 国产视频在线观看一区| 亚洲精品美女在线| 久久成人免费电影| 91久久国产综合久久91精品网站| 99视频国产精品免费观看| 亚洲欧美精品伊人久久| 欧美xx视频| 亚洲一区二区av电影| 嫩草影视亚洲| 国产午夜久久久久| 亚洲一区在线看| 欧美丰满少妇xxxbbb| 亚洲自拍偷拍一区| 欧美日韩免费一区二区三区视频| 久久久青草青青国产亚洲免观| 在线视频欧美精品| 久久婷婷影院| 国产精品美女久久久久aⅴ国产馆| 久久精品国产99国产精品澳门| 欧美一区二区三区免费观看视频 | 亚洲一区二区三区精品视频| 欧美一二三视频| 亚洲黄色在线| 久久尤物视频| 韩日精品视频| 久久精品动漫| 亚洲欧美在线一区二区| 欧美日本免费一区二区三区| 亚洲成人在线| 美女在线一区二区| 欧美中文在线视频| 国产欧美一区二区精品忘忧草| 国产亚洲精品成人av久久ww| 一区二区三区四区蜜桃| 欧美成人激情在线| 久久久久久久久久久久久女国产乱 | 亚洲欧美成人一区二区在线电影 | 亚洲免费在线电影| 亚洲精品久久久久久久久| 美国十次成人| 伊人久久综合97精品| 久久久久国产精品一区二区| 午夜在线不卡| 国内精品美女av在线播放| 久久久久久久久久码影片| 久久精品国产一区二区三| 狠狠久久亚洲欧美| 欧美高清视频一二三区| 久热综合在线亚洲精品| 亚洲国产日韩美| 亚洲激情av| 国产精品hd| 欧美一区网站| 久久激情五月丁香伊人| 影音先锋欧美精品| 亚洲电影av| 欧美日韩一区二区三区在线| 午夜国产精品影院在线观看| 午夜视频精品| 亚洲国产精品一区二区www| 欧美激情影院| 国产精品美女主播| 久久精品国语| 欧美精品18| 欧美一区三区二区在线观看| 久久亚洲春色中文字幕| 一区二区三区视频在线| 欧美一区高清| 亚洲最新在线视频| 欧美在线资源| 亚洲视频专区在线| 久久九九久精品国产免费直播 | 99热这里只有精品8| 欧美日韩一区二区视频在线| 亚洲与欧洲av电影| 久久精品亚洲一区二区| 亚洲美女视频在线免费观看| 这里只有精品丝袜| 亚洲第一成人在线| 亚洲天堂黄色| 亚洲高清色综合| 欧美日韩午夜剧场| 久久精品国产999大香线蕉| 久热精品视频在线| 午夜电影亚洲| 欧美日本精品| 欧美成黄导航| 国产日韩精品电影| 一区二区高清| 亚洲精品视频在线播放| 欧美一区二区在线免费观看| 一区二区三区产品免费精品久久75| 美女脱光内衣内裤视频久久影院 | 亚洲国产一区二区视频| 国产精品一区免费视频| 亚洲第一精品久久忘忧草社区| 久久久久久久999| 亚洲一级在线观看| 欧美电影在线播放| 免费欧美网站| 激情婷婷久久| 欧美一区二区视频网站| 亚洲午夜av| 欧美精品一区在线| 亚洲国产综合视频在线观看| 激情视频一区二区三区| 欧美亚洲日本网站| 小黄鸭精品密入口导航| 欧美日精品一区视频| 亚洲精品亚洲人成人网| 亚洲另类在线视频| 欧美成人精品在线播放| 欧美激情精品久久久久久变态| 欧美日本网站| 91久久国产综合久久蜜月精品 | 国产午夜精品久久| 亚洲图片欧美日产| 西瓜成人精品人成网站| 国产精品h在线观看| 国产精品99久久久久久有的能看| 国产精品久久久久久久电影 | av成人天堂| 在线一区二区三区做爰视频网站 | 欧美精品18+| 亚洲高清在线播放| 亚洲巨乳在线| 久久精品国产亚洲一区二区三区| 一区二区三区视频观看| 亚洲精品中文字幕有码专区| 欧美高清自拍一区| 亚洲精品欧美日韩| 亚洲欧美成人一区二区在线电影| 久久精品99国产精品日本| 午夜影视日本亚洲欧洲精品| 国产精品一区毛片| 久久久久九九视频| 欧美福利视频在线观看| 宅男精品视频| 国产在线成人| 欧美成人在线网站| 亚洲一区二区精品| 老牛影视一区二区三区| 亚洲经典在线| 国产精品人人爽人人做我的可爱| 久久精品成人一区二区三区| 国产一区视频在线看| 你懂的网址国产 欧美| 一区二区国产在线观看| 久久久久久久综合狠狠综合| 精品盗摄一区二区三区| 欧美激情综合在线| 亚洲欧美另类国产| 欧美激情第一页xxx| 亚洲一区二区三区久久| 伊人成人网在线看| 欧美午夜精品久久久| 欧美一区二区日韩| 亚洲精品一区二区三区樱花 | 久久国产色av| 亚洲电影免费观看高清完整版在线观看 | 亚洲人成在线免费观看| 亚洲欧美区自拍先锋| 国产一区二区三区日韩欧美| 欧美大色视频| 欧美在线免费播放| 亚洲精品欧美| 免费日韩成人| 久久riav二区三区| 亚洲一区二区精品| 最新国产成人在线观看| 国产在线精品一区二区中文| 欧美日韩国产在线观看| 久久久久高清| 性感少妇一区| 99精品热视频只有精品10| 久久综合99re88久久爱| 午夜精品久久久久久久久久久久久| 免费成人av| 久久精品夜色噜噜亚洲a∨| 亚洲伦理一区|