第7章進(jìn)程通信_(tái)第1頁(yè)
第7章進(jìn)程通信_(tái)第2頁(yè)
第7章進(jìn)程通信_(tái)第3頁(yè)
第7章進(jìn)程通信_(tái)第4頁(yè)
第7章進(jìn)程通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論