第7章進程通信_第1頁
第7章進程通信_第2頁
第7章進程通信_第3頁
第7章進程通信_第4頁
第7章進程通信_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第7章章進 程 通 信2本章重點q 進程通信中信號的概念及信號處理q 進程間的管道通信編程q 進程間的內存共享編程q 進程間的隊列通信編程3 7.1 進程間通信q 每個進程有不同的進程地址空間,進程之間要交換數(shù)據(jù)必須通過內核。q 在內核中開辟一塊緩沖區(qū),P1進程把數(shù)據(jù)從用戶空間拷貝到內核緩沖區(qū),P2進程再從內核緩沖區(qū)把數(shù)據(jù)讀走。q 內核提供的這種機制稱為進程間的通信(IPC, InterProcess Communication)(見下圖)q 實現(xiàn)進程間通信的方法:信號(signal)、管道(pipe)、套接字(socket)、System V IPC 機制(消息隊列、信號量、共享內存)進程

2、1 P1進程2 P2信號、管道、隊列、共享內存等用戶空間內核空間4 7.2 信號q 信號是Linux系統(tǒng)中用于進程之間相互通信或操作的一種機制。q 信號可以在任何時候發(fā)給某一進程,而無需知道該進程的狀態(tài)。如果該進程當前處于未執(zhí)行的狀態(tài),則該信號由內核保存起來,直到該進程恢復執(zhí)行,則將信號傳遞給該進程;如果一個信號被進程設置為阻塞,則該信號被延遲傳遞,直到阻塞被取消時,信號才被傳遞給進程。q 使用信號時,應包含頭文件5 7.2 信號7.2.1 信號及其使用簡介q 信號是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式(異步通信:發(fā)送端可以在任意時刻開始發(fā)送字符,所發(fā)送的字符之間的時間間隔可以

3、是任意的)q 信號可以在進程和內核之間直接交互,內核也可以利用信號來通知進程發(fā)生了哪些系統(tǒng)事件。q 信號事件的發(fā)生源有兩個:硬件來源:+C,產(chǎn)生中斷信號(SIGINT)軟件來源:使用系統(tǒng)調用或者使用命令發(fā)出信號。發(fā)送信號的函數(shù)有:killraisealarmsetitimersigationsigqueue軟件來源還包括一些非法運算操作6 7.2 信號7.2.1 信號及其使用簡介q 例7.1 列出Linux系統(tǒng)所支持的所有信號列表q 信號值131以”SIG”開頭;3449以”SIGRTMIN”開頭(不可靠信號、非實時信號);5064以”SIGRTMAX”開頭(可靠信號、實時信號)7 7.2 信

4、號7.2.1 信號及其使用簡介q 例7.1 (續(xù))q 可靠信號(5064):支持排隊,信號發(fā)送給用戶進程一次就注冊一次;即使發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,也要再注冊q 不可靠信號(131、3449):不支持排隊,信號發(fā)送給用戶進程后進行判斷,如果發(fā)現(xiàn)相同信號已經(jīng)在進程中注冊,就不再注冊,忽略該信號。信號產(chǎn)生內核進程信號注冊信號處理信號注銷用戶進程信號的生命周期8 7.2 信號7.2.1 信號及其使用簡介q 用戶進程對信號的響應有三種方式:執(zhí)行默認操作。Linux對每一種信號都規(guī)定了默認的操作捕捉信號。當信號發(fā)生時,執(zhí)行所定義的信號處理函數(shù)(詳見7.2.2節(jié)第2小結“信號處理”)忽略信號。當不希

5、望接收到的信號對進程的執(zhí)行產(chǎn)生影響時,忽略該信號,即不對信號做任何處理;應用程序對SIGKILL、SIGSTOP無法捕捉和忽略,以便系統(tǒng)管理員能在任何時候中斷或結束某一特定的進程。9 7.2 信號7.2.2 信號操作的相關函數(shù)kill:發(fā)送信號SIGKILL給進程或進程組raise:發(fā)送信號給進程或自身alarm:當定時器時間到時,向進程發(fā)送SIGALARM信號pause:沒有捕捉到信號前一直將進程掛起signal:捕捉到信號SIGINT、SIG_IGN、SIG_DFL、SIGQUIT時執(zhí)行信號處理函數(shù)sigemptyset:初始化信號集合為空sigfillset:初始化信號集合為所有信號集s

6、igaddset:將指定信號加入到指定集合sigdelset:將指定信號從信號集中刪除sigismember:查詢指定信號是否在信號集合之中sigprocmask:判斷檢測或更改信號屏蔽字10 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送信號發(fā)送的關鍵:q 讓系統(tǒng)知道哪個進程發(fā)送信號、發(fā)送什么信號q 能否向某一進程發(fā)送某一特定信號與用戶的權限密切相關 例如,只有系統(tǒng)管理員才能向任何一個進程發(fā)送SIGKILL信號,以便終止該進程。alarm函數(shù)原型函數(shù)原型: int alarm(int seconds) 告訴內核在seconds秒之后給當前進程發(fā)SIGALRM信號,該信號的默認處理動作是終

7、止當前進程,函數(shù)返回值為0或距離所設定時間的秒數(shù)。11 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送例7.2 下列程序應用函數(shù)alarm(10)在運行10秒后發(fā)送信號SIGALRM,程序接收到SIGALRM信號后被終止。12 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送例7.2(續(xù))運行結果:13 7.2 信號7.2.2 信號操作的相關函數(shù)1. 信號發(fā)送waitpid函數(shù)原型函數(shù)原型:pid_t waitpid(pid_t pid, int *status, int options);pid:子進程號status:子進程的狀態(tài)options:可以為 0 或可以用“|”運算符把它們連

8、接起來使用,例如:ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);其中,WNOHANG表示,若pid指定的子進程沒有結束,則waitpid()函數(shù)返回0,不予以等待。若結束,則返回該子進程的ID。WUNTRACED表示,若子進程進入暫停狀態(tài),則馬上返回,但子進程的結束狀態(tài)不予以理會。WIFSTOPPED(status)宏確定返回值是否對應于一個暫停子進程。參考:http:/ kill(pid_t pid, int sig);給特定的進程或進程組發(fā)送信號,執(zhí)行成功則返回0,有錯誤則返回-1raise函數(shù)原型:函數(shù)原型:int raise(int sig);向進程

9、自身發(fā)送信號,執(zhí)行成功則返回0,有錯誤則返回-114 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送例7.3 創(chuàng)建一個子進程,父進程向子進程發(fā)出SIGKILL信號,子進程收到此信號后,結束其自身的運行。15 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送例7.3 (續(xù))創(chuàng)建一個子進程,父進程向子進程發(fā)出SIGKILL信號,子進程收到此信號后,結束其自身的運行。16 7.2 信號7.2.2 信號操作的相關函數(shù)信號發(fā)送例7.3(續(xù))運行結果:17 7.2 信號7.2.2 信號操作的相關函數(shù)2. 信號處理 在編寫程序代碼時,對需要進程捕獲的信號給出相應的處理程序代碼。 一旦接收到此信號,則通

10、知系統(tǒng)調用相應的信號處理函數(shù)進行處理。signal函數(shù)原型:函數(shù)原型:void (*singal(int signum, void(* handler)(int)(int);定義返回函數(shù)指針的函數(shù):return_type (*function(func_parameter_list) (parameter_list)定義了一個函數(shù)function,該函數(shù)的參數(shù)列表是(function_patameter_list),返回類型是一個函數(shù)指針,這個函數(shù)指針的原型是return_type(*)(parameter_list)。參考:http:/ 7.2 信號7.2.2 信號操作的相關函數(shù)2. 信號處

11、理signal函數(shù)原型:(續(xù))函數(shù)原型:(續(xù))void (*singal(int signum, void(* handler)(int)(int); singal() 依照參數(shù)signum指定的信號編號來設置該信號的處理函數(shù)。 當指定的信號到達時就會跳轉到參數(shù)當指定的信號到達時就會跳轉到參數(shù)handler指定的函數(shù)執(zhí)行。指定的函數(shù)執(zhí)行。 如果參數(shù)handler不是函數(shù)指針,則必須是下列兩個常數(shù)之一:SIG_IGN 忽略參數(shù)signum指定的信號SIG_DFL將參數(shù)signum指定的信號重設為系統(tǒng)默認的信號處理方式 返回先前的信號處理函數(shù)指針signal函數(shù)的特點: 主要用于編號為131的非實

12、時信號的處理。 使用時只需把“欲處理的信號”、“處理函數(shù)”列出即可19 7.2 信號7.2.2 信號操作的相關函數(shù)2. 信號處理例7.4 程序運行后進入無限循環(huán),當用戶按下中斷鍵(+C)時,進入自定義信號處理函數(shù),再次按下中斷鍵后,結束程序運行。20 7.2 信號7.2.2 信號操作的相關函數(shù)信號處理例7.4(續(xù))運行結果:21 7.2 信號7.2.2 信號操作的相關函數(shù)3. 信號阻塞 當不希望進程在接收到信號時立刻中斷執(zhí)行,也不希望完全忽略此信號,而是希望延遲一段時間再去調用信號處理函數(shù),此時需要用信號阻塞。信號阻塞需要用到下列信號集操作函數(shù):#include int sigemptyset

13、(sigset_t *set); /初始化信號集,清零,不包含任何有效信號int sigfillset(sigset_t *set); /初始化信號集,置位,包含系統(tǒng)支持的所有信號注:在使用sigset_t類型的變量前,需要調用以上兩個函數(shù)之一使得信號集處于確定狀態(tài)int sigaddset(sigset_t *set , int signo); /在信號集中添加某個有效信號int sigdelset(sigset_t *set , int signo); /在信號集中刪除某個有效信號注:以上4個函數(shù)執(zhí)行成功則返回0,出錯返回-1int sigismember(const sigset_t *

14、set, int signo); /判斷一個信號集是否包含某種信號,包含則返回1,不包含則返回0,出錯則返回-122 7.2 信號7.2.2 信號操作的相關函數(shù)3. 信號阻塞 當不希望進程在接收到信號時立刻中斷執(zhí)行,也不希望完全忽略此信號,而是希望延遲一段時間再去調用信號處理函數(shù),此時需要用信號阻塞。信號阻塞需要用到下列信號集操作函數(shù):(續(xù))int sigprocmask(int how, const sigset_t *set, sigset _t*oldset);功能:查詢或設置信號掩碼,參數(shù)how有以下幾種: SIG_BLOCK:將set所指向的信號集中所包含的信號加到當前的信號掩碼中,

15、作為新的信號屏蔽字。 SIG_UNBLOCK:將參數(shù)set所指向的信號集中的信號從當前的信號掩碼中移除,即解除對set所指向信號集中信號的屏蔽。 SIG_SETMASK:設置當前的信號掩碼為參數(shù)set所指向的信號集中所包含的信號,即作為屏蔽字。 如果參數(shù)oldset不是NULL指針,那么目前的信號屏蔽字會由此指針返回。參考:http:/ 7.2 信號7.2.2 信號操作的相關函數(shù)3. 信號阻塞例7.5 主程序在運行時,即使按下中斷鍵(+C),也不影響正在運行的程序,即讓信號處于阻塞狀態(tài);當信號阻塞被解除以后方才進入自定義信號處理函數(shù)。運行結果如下:對于非實時信號:發(fā)現(xiàn)相同信號已在進程中注冊,則忽略該信號24 7.2 信號7.2.2 信號操作的相關函數(shù)3. 信號阻塞例7.5 主程序在運行時,即使按下中斷鍵(+C),也不影響正在運行的程序,即讓信號處于阻塞狀態(tài);當信號阻塞被解除以后方才進入自定義信號處理函數(shù)。源

溫馨提示

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

評論

0/150

提交評論