




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第7章章進(jìn) 程 通 信2本章重點(diǎn)q 進(jìn)程通信中信號(hào)的概念及信號(hào)處理q 進(jìn)程間的管道通信編程q 進(jìn)程間的內(nèi)存共享編程q 進(jìn)程間的隊(duì)列通信編程3 7.1 進(jìn)程間通信q 每個(gè)進(jìn)程有不同的進(jìn)程地址空間,進(jìn)程之間要交換數(shù)據(jù)必須通過(guò)內(nèi)核。q 在內(nèi)核中開辟一塊緩沖區(qū),P1進(jìn)程把數(shù)據(jù)從用戶空間拷貝到內(nèi)核緩沖區(qū),P2進(jìn)程再?gòu)膬?nèi)核緩沖區(qū)把數(shù)據(jù)讀走。q 內(nèi)核提供的這種機(jī)制稱為進(jìn)程間的通信(IPC, InterProcess Communication)(見下圖)q 實(shí)現(xiàn)進(jìn)程間通信的方法:信號(hào)(signal)、管道(pipe)、套接字(socket)、System V IPC 機(jī)制(消息隊(duì)列、信號(hào)量、共享內(nèi)存)進(jìn)程
2、1 P1進(jìn)程2 P2信號(hào)、管道、隊(duì)列、共享內(nèi)存等用戶空間內(nèi)核空間4 7.2 信號(hào)q 信號(hào)是Linux系統(tǒng)中用于進(jìn)程之間相互通信或操作的一種機(jī)制。q 信號(hào)可以在任何時(shí)候發(fā)給某一進(jìn)程,而無(wú)需知道該進(jìn)程的狀態(tài)。如果該進(jìn)程當(dāng)前處于未執(zhí)行的狀態(tài),則該信號(hào)由內(nèi)核保存起來(lái),直到該進(jìn)程恢復(fù)執(zhí)行,則將信號(hào)傳遞給該進(jìn)程;如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)被延遲傳遞,直到阻塞被取消時(shí),信號(hào)才被傳遞給進(jìn)程。q 使用信號(hào)時(shí),應(yīng)包含頭文件5 7.2 信號(hào)7.2.1 信號(hào)及其使用簡(jiǎn)介q 信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,是一種異步通信方式(異步通信:發(fā)送端可以在任意時(shí)刻開始發(fā)送字符,所發(fā)送的字符之間的時(shí)間間隔可以
3、是任意的)q 信號(hào)可以在進(jìn)程和內(nèi)核之間直接交互,內(nèi)核也可以利用信號(hào)來(lái)通知進(jìn)程發(fā)生了哪些系統(tǒng)事件。q 信號(hào)事件的發(fā)生源有兩個(gè):硬件來(lái)源:+C,產(chǎn)生中斷信號(hào)(SIGINT)軟件來(lái)源:使用系統(tǒng)調(diào)用或者使用命令發(fā)出信號(hào)。發(fā)送信號(hào)的函數(shù)有:killraisealarmsetitimersigationsigqueue軟件來(lái)源還包括一些非法運(yùn)算操作6 7.2 信號(hào)7.2.1 信號(hào)及其使用簡(jiǎn)介q 例7.1 列出Linux系統(tǒng)所支持的所有信號(hào)列表q 信號(hào)值131以”SIG”開頭;3449以”SIGRTMIN”開頭(不可靠信號(hào)、非實(shí)時(shí)信號(hào));5064以”SIGRTMAX”開頭(可靠信號(hào)、實(shí)時(shí)信號(hào))7 7.2 信
4、號(hào)7.2.1 信號(hào)及其使用簡(jiǎn)介q 例7.1 (續(xù))q 可靠信號(hào)(5064):支持排隊(duì),信號(hào)發(fā)送給用戶進(jìn)程一次就注冊(cè)一次;即使發(fā)現(xiàn)相同信號(hào)已經(jīng)在進(jìn)程中注冊(cè),也要再注冊(cè)q 不可靠信號(hào)(131、3449):不支持排隊(duì),信號(hào)發(fā)送給用戶進(jìn)程后進(jìn)行判斷,如果發(fā)現(xiàn)相同信號(hào)已經(jīng)在進(jìn)程中注冊(cè),就不再注冊(cè),忽略該信號(hào)。信號(hào)產(chǎn)生內(nèi)核進(jìn)程信號(hào)注冊(cè)信號(hào)處理信號(hào)注銷用戶進(jìn)程信號(hào)的生命周期8 7.2 信號(hào)7.2.1 信號(hào)及其使用簡(jiǎn)介q 用戶進(jìn)程對(duì)信號(hào)的響應(yīng)有三種方式:執(zhí)行默認(rèn)操作。Linux對(duì)每一種信號(hào)都規(guī)定了默認(rèn)的操作捕捉信號(hào)。當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行所定義的信號(hào)處理函數(shù)(詳見7.2.2節(jié)第2小結(jié)“信號(hào)處理”)忽略信號(hào)。當(dāng)不希
5、望接收到的信號(hào)對(duì)進(jìn)程的執(zhí)行產(chǎn)生影響時(shí),忽略該信號(hào),即不對(duì)信號(hào)做任何處理;應(yīng)用程序?qū)IGKILL、SIGSTOP無(wú)法捕捉和忽略,以便系統(tǒng)管理員能在任何時(shí)候中斷或結(jié)束某一特定的進(jìn)程。9 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)kill:發(fā)送信號(hào)SIGKILL給進(jìn)程或進(jìn)程組raise:發(fā)送信號(hào)給進(jìn)程或自身alarm:當(dāng)定時(shí)器時(shí)間到時(shí),向進(jìn)程發(fā)送SIGALARM信號(hào)pause:沒(méi)有捕捉到信號(hào)前一直將進(jìn)程掛起signal:捕捉到信號(hào)SIGINT、SIG_IGN、SIG_DFL、SIGQUIT時(shí)執(zhí)行信號(hào)處理函數(shù)sigemptyset:初始化信號(hào)集合為空sigfillset:初始化信號(hào)集合為所有信號(hào)集s
6、igaddset:將指定信號(hào)加入到指定集合sigdelset:將指定信號(hào)從信號(hào)集中刪除sigismember:查詢指定信號(hào)是否在信號(hào)集合之中sigprocmask:判斷檢測(cè)或更改信號(hào)屏蔽字10 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送信號(hào)發(fā)送的關(guān)鍵:q 讓系統(tǒng)知道哪個(gè)進(jìn)程發(fā)送信號(hào)、發(fā)送什么信號(hào)q 能否向某一進(jìn)程發(fā)送某一特定信號(hào)與用戶的權(quán)限密切相關(guān) 例如,只有系統(tǒng)管理員才能向任何一個(gè)進(jìn)程發(fā)送SIGKILL信號(hào),以便終止該進(jìn)程。alarm函數(shù)原型函數(shù)原型: int alarm(int seconds) 告訴內(nèi)核在seconds秒之后給當(dāng)前進(jìn)程發(fā)SIGALRM信號(hào),該信號(hào)的默認(rèn)處理動(dòng)作是終
7、止當(dāng)前進(jìn)程,函數(shù)返回值為0或距離所設(shè)定時(shí)間的秒數(shù)。11 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送例7.2 下列程序應(yīng)用函數(shù)alarm(10)在運(yùn)行10秒后發(fā)送信號(hào)SIGALRM,程序接收到SIGALRM信號(hào)后被終止。12 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送例7.2(續(xù))運(yùn)行結(jié)果:13 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)1. 信號(hào)發(fā)送waitpid函數(shù)原型函數(shù)原型:pid_t waitpid(pid_t pid, int *status, int options);pid:子進(jìn)程號(hào)status:子進(jìn)程的狀態(tài)options:可以為 0 或可以用“|”運(yùn)算符把它們連
8、接起來(lái)使用,例如:ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);其中,WNOHANG表示,若pid指定的子進(jìn)程沒(méi)有結(jié)束,則waitpid()函數(shù)返回0,不予以等待。若結(jié)束,則返回該子進(jìn)程的ID。WUNTRACED表示,若子進(jìn)程進(jìn)入暫停狀態(tài),則馬上返回,但子進(jìn)程的結(jié)束狀態(tài)不予以理會(huì)。WIFSTOPPED(status)宏確定返回值是否對(duì)應(yīng)于一個(gè)暫停子進(jìn)程。參考:http:/ kill(pid_t pid, int sig);給特定的進(jìn)程或進(jìn)程組發(fā)送信號(hào),執(zhí)行成功則返回0,有錯(cuò)誤則返回-1raise函數(shù)原型:函數(shù)原型:int raise(int sig);向進(jìn)程
9、自身發(fā)送信號(hào),執(zhí)行成功則返回0,有錯(cuò)誤則返回-114 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送例7.3 創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程向子進(jìn)程發(fā)出SIGKILL信號(hào),子進(jìn)程收到此信號(hào)后,結(jié)束其自身的運(yùn)行。15 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送例7.3 (續(xù))創(chuàng)建一個(gè)子進(jìn)程,父進(jìn)程向子進(jìn)程發(fā)出SIGKILL信號(hào),子進(jìn)程收到此信號(hào)后,結(jié)束其自身的運(yùn)行。16 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)發(fā)送例7.3(續(xù))運(yùn)行結(jié)果:17 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)2. 信號(hào)處理 在編寫程序代碼時(shí),對(duì)需要進(jìn)程捕獲的信號(hào)給出相應(yīng)的處理程序代碼。 一旦接收到此信號(hào),則通
10、知系統(tǒng)調(diào)用相應(yīng)的信號(hào)處理函數(shù)進(jìn)行處理。signal函數(shù)原型:函數(shù)原型:void (*singal(int signum, void(* handler)(int)(int);定義返回函數(shù)指針的函數(shù):return_type (*function(func_parameter_list) (parameter_list)定義了一個(gè)函數(shù)function,該函數(shù)的參數(shù)列表是(function_patameter_list),返回類型是一個(gè)函數(shù)指針,這個(gè)函數(shù)指針的原型是return_type(*)(parameter_list)。參考:http:/ 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)2. 信號(hào)處
11、理signal函數(shù)原型:(續(xù))函數(shù)原型:(續(xù))void (*singal(int signum, void(* handler)(int)(int); singal() 依照參數(shù)signum指定的信號(hào)編號(hào)來(lái)設(shè)置該信號(hào)的處理函數(shù)。 當(dāng)指定的信號(hào)到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)當(dāng)指定的信號(hào)到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。指定的函數(shù)執(zhí)行。 如果參數(shù)handler不是函數(shù)指針,則必須是下列兩個(gè)常數(shù)之一:SIG_IGN 忽略參數(shù)signum指定的信號(hào)SIG_DFL將參數(shù)signum指定的信號(hào)重設(shè)為系統(tǒng)默認(rèn)的信號(hào)處理方式 返回先前的信號(hào)處理函數(shù)指針signal函數(shù)的特點(diǎn): 主要用于編號(hào)為131的非實(shí)
12、時(shí)信號(hào)的處理。 使用時(shí)只需把“欲處理的信號(hào)”、“處理函數(shù)”列出即可19 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)2. 信號(hào)處理例7.4 程序運(yùn)行后進(jìn)入無(wú)限循環(huán),當(dāng)用戶按下中斷鍵(+C)時(shí),進(jìn)入自定義信號(hào)處理函數(shù),再次按下中斷鍵后,結(jié)束程序運(yùn)行。20 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)信號(hào)處理例7.4(續(xù))運(yùn)行結(jié)果:21 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)3. 信號(hào)阻塞 當(dāng)不希望進(jìn)程在接收到信號(hào)時(shí)立刻中斷執(zhí)行,也不希望完全忽略此信號(hào),而是希望延遲一段時(shí)間再去調(diào)用信號(hào)處理函數(shù),此時(shí)需要用信號(hào)阻塞。信號(hào)阻塞需要用到下列信號(hào)集操作函數(shù):#include int sigemptyset
13、(sigset_t *set); /初始化信號(hào)集,清零,不包含任何有效信號(hào)int sigfillset(sigset_t *set); /初始化信號(hào)集,置位,包含系統(tǒng)支持的所有信號(hào)注:在使用sigset_t類型的變量前,需要調(diào)用以上兩個(gè)函數(shù)之一使得信號(hào)集處于確定狀態(tài)int sigaddset(sigset_t *set , int signo); /在信號(hào)集中添加某個(gè)有效信號(hào)int sigdelset(sigset_t *set , int signo); /在信號(hào)集中刪除某個(gè)有效信號(hào)注:以上4個(gè)函數(shù)執(zhí)行成功則返回0,出錯(cuò)返回-1int sigismember(const sigset_t *
14、set, int signo); /判斷一個(gè)信號(hào)集是否包含某種信號(hào),包含則返回1,不包含則返回0,出錯(cuò)則返回-122 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)3. 信號(hào)阻塞 當(dāng)不希望進(jìn)程在接收到信號(hào)時(shí)立刻中斷執(zhí)行,也不希望完全忽略此信號(hào),而是希望延遲一段時(shí)間再去調(diào)用信號(hào)處理函數(shù),此時(shí)需要用信號(hào)阻塞。信號(hào)阻塞需要用到下列信號(hào)集操作函數(shù):(續(xù))int sigprocmask(int how, const sigset_t *set, sigset _t*oldset);功能:查詢或設(shè)置信號(hào)掩碼,參數(shù)how有以下幾種: SIG_BLOCK:將set所指向的信號(hào)集中所包含的信號(hào)加到當(dāng)前的信號(hào)掩碼中,
15、作為新的信號(hào)屏蔽字。 SIG_UNBLOCK:將參數(shù)set所指向的信號(hào)集中的信號(hào)從當(dāng)前的信號(hào)掩碼中移除,即解除對(duì)set所指向信號(hào)集中信號(hào)的屏蔽。 SIG_SETMASK:設(shè)置當(dāng)前的信號(hào)掩碼為參數(shù)set所指向的信號(hào)集中所包含的信號(hào),即作為屏蔽字。 如果參數(shù)oldset不是NULL指針,那么目前的信號(hào)屏蔽字會(huì)由此指針?lè)祷亍⒖迹篽ttp:/ 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)3. 信號(hào)阻塞例7.5 主程序在運(yùn)行時(shí),即使按下中斷鍵(+C),也不影響正在運(yùn)行的程序,即讓信號(hào)處于阻塞狀態(tài);當(dāng)信號(hào)阻塞被解除以后方才進(jìn)入自定義信號(hào)處理函數(shù)。運(yùn)行結(jié)果如下:對(duì)于非實(shí)時(shí)信號(hào):發(fā)現(xiàn)相同信號(hào)已在進(jìn)程中注冊(cè),則忽略該信號(hào)24 7.2 信號(hào)7.2.2 信號(hào)操作的相關(guān)函數(shù)3. 信號(hào)阻塞例7.5 主程序在運(yùn)行時(shí),即使按下中斷鍵(+C),也不影響正在運(yùn)行的程序,即讓信號(hào)處于阻塞狀態(tài);當(dāng)信號(hào)阻塞被解除以后方才進(jìn)入自定義信號(hào)處理函數(shù)。源
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城域組網(wǎng)優(yōu)化方案-洞察及研究
- JJG 204-2025氣象用通風(fēng)干濕表檢定規(guī)程
- 安全生產(chǎn)兩本臺(tái)賬
- 安保管理方案及措施
- 安全生產(chǎn)入職培訓(xùn)
- 創(chuàng)新教育體驗(yàn)數(shù)字化技術(shù)在課堂的應(yīng)用
- 高效檔案檢索與存儲(chǔ)技術(shù)-洞察闡釋
- 無(wú)線通信設(shè)備標(biāo)準(zhǔn)化-洞察闡釋
- 貴州地區(qū)稅收政策與區(qū)域經(jīng)濟(jì)協(xié)同發(fā)展-洞察闡釋
- 生產(chǎn)安全事故應(yīng)急預(yù)案分為
- 初一生活學(xué)習(xí)指導(dǎo)
- 下肢靜脈曲張
- 2024年露營(yíng)帳篷項(xiàng)目可行性研究報(bào)告
- 《公務(wù)員錄用體檢操作手冊(cè)(試行)》
- 2024粵東西粵北地區(qū)教師全員輪訓(xùn)培訓(xùn)心得總結(jié)
- 2024-2025學(xué)年華東師大版數(shù)學(xué)七年級(jí)上冊(cè)計(jì)算題專項(xiàng)訓(xùn)練
- 福建省機(jī)關(guān)工作人員年度考核登記表
- JBT 7808-2010 無(wú)損檢測(cè)儀器 工業(yè)X射線探傷機(jī)主參數(shù)系列
- DB44-T 2474-2024 自然教育標(biāo)識(shí)設(shè)置指引
- 研學(xué)基地合作協(xié)議
- 駕駛員行為規(guī)范管理制度
評(píng)論
0/150
提交評(píng)論