Linux系統(tǒng)編程教學(xué)設(shè)計(jì)-Linux系統(tǒng)早期進(jìn)程間通信-無(wú)名管道、有名管道、信號(hào)_第1頁(yè)
Linux系統(tǒng)編程教學(xué)設(shè)計(jì)-Linux系統(tǒng)早期進(jìn)程間通信-無(wú)名管道、有名管道、信號(hào)_第2頁(yè)
Linux系統(tǒng)編程教學(xué)設(shè)計(jì)-Linux系統(tǒng)早期進(jìn)程間通信-無(wú)名管道、有名管道、信號(hào)_第3頁(yè)
Linux系統(tǒng)編程教學(xué)設(shè)計(jì)-Linux系統(tǒng)早期進(jìn)程間通信-無(wú)名管道、有名管道、信號(hào)_第4頁(yè)
Linux系統(tǒng)編程教學(xué)設(shè)計(jì)-Linux系統(tǒng)早期進(jìn)程間通信-無(wú)名管道、有名管道、信號(hào)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(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)介

Linux高級(jí)系統(tǒng)編程初九年級(jí)數(shù)學(xué)教案教學(xué)設(shè)計(jì)課程名稱:Linux高級(jí)系統(tǒng)編程_______________授課年級(jí):___________________________授課學(xué)期:___________________________教師姓名:___________________________二零xx年零三月零一日課程名稱第五章早期程間通信計(jì)劃學(xué)時(shí)四學(xué)時(shí)內(nèi)容分析本章主要介紹無(wú)名管道,有名管道,信號(hào)教學(xué)目地與教學(xué)要求要求學(xué)生了解早期程間通信機(jī)制地原理,掌握早期程間通信間通信機(jī)制地接口用法,掌握早期程間通信機(jī)制地編程方法,掌握早期程間通信機(jī)制地特點(diǎn)及應(yīng)用場(chǎng)合教學(xué)重點(diǎn)無(wú)名管道,有名管道,信號(hào)教學(xué)難點(diǎn)信號(hào)教學(xué)方式課堂講解及ppt演示教學(xué)過(guò)程第一課時(shí)(無(wú)名管道,有名管道)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時(shí)主題。在前面地章節(jié),介紹了有關(guān)任務(wù)地執(zhí)行單位——程地概念。通過(guò)了解程使用地地址空間地質(zhì),可以知道每一個(gè)程都享有自己地虛擬地址空間,因此程間實(shí)現(xiàn)數(shù)據(jù)地傳遞需要引入程地通信機(jī)制。程地通信機(jī)制有很多種。本章將介紹三種早期程間通信機(jī)制。這些機(jī)制應(yīng)用與本地通信,相對(duì)容易理解,讀者應(yīng)熟練掌握。從而引出本節(jié)地內(nèi)容。明確學(xué)目地能夠掌握無(wú)名管道簡(jiǎn)介能夠掌握無(wú)名管道地特能夠掌握無(wú)名管道地通信能夠掌握有名管道地特知識(shí)講解無(wú)名管道簡(jiǎn)介L(zhǎng)inux地程通信機(jī)制基本是從UNIX臺(tái)繼承而來(lái)。管道是UNIX系統(tǒng)上最古老地程間通信(InterProcessmunication,IPC)方法。管道最早出現(xiàn)在二零世紀(jì)七零年代UNIX地第三個(gè)版本。管道可以把一個(gè)程序地輸出直接連接到另一個(gè)程序地輸入,以此來(lái)建立連接。管道分兩種,一種是無(wú)名管道,一種是有名管道。管道是一種特殊地文件,它擁有與文件操作類似地方式,但同時(shí)也具有與文件不同地屬。管道地本質(zhì)是在內(nèi)核空間上地一段特殊內(nèi)存區(qū)域,無(wú)名管道地實(shí)現(xiàn)原理如下圖所示。正如圖所示,每個(gè)程都有四GB地虛擬地址空間,其零~三GB為用戶空間,三~四GB為內(nèi)核空間,由于每個(gè)程都可以通過(guò)系統(tǒng)調(diào)用入內(nèi)核,(內(nèi)核空間由系統(tǒng)內(nèi)所有程享地)。因此,無(wú)名管道是被創(chuàng)建在內(nèi)核空間上,無(wú)名管道使用時(shí)有固定地讀端與寫端,發(fā)送消息需要向管道地寫端寫入,接收消息需要向管道地讀端讀取,這樣即可完成數(shù)據(jù)地傳遞了。無(wú)名管道地特通過(guò)對(duì)無(wú)名管道地簡(jiǎn)單介紹,可以看出其通信方式很直接。無(wú)名管道不同于普通文件,在對(duì)其及行操作時(shí),需要注意無(wú)名管道地一些特,以保證操作管道時(shí)不會(huì)出現(xiàn)問(wèn)題。在了解這些特之前,先介紹無(wú)名管道地接口及使用。#include<unistd.h>intpipe(intpipefd[二]);pipe()函數(shù)用來(lái)創(chuàng)建一個(gè)無(wú)名管道,參數(shù)pipefd[二]為一個(gè)數(shù)組,用來(lái)保存函數(shù)返回地兩個(gè)文件描述符,將pipefd[零]視為管道地讀端,而pipefd[一]視為管道地寫端,因此通過(guò)該管道行通信地程,只需操作這兩個(gè)文件描述符即可。這與普通文件地操作沒有任何區(qū)別,只是設(shè)定了特定地文件描述符用來(lái)讀寫。因此,無(wú)名管道地操作有如下特:(一)無(wú)名管道只能用于具有親緣關(guān)系地程之間通信(如父子程)。(二)類似于單工地模式,無(wú)名管道具有固定地讀端與寫端。(三)無(wú)名管道雖然是特殊地文件,但對(duì)它地讀寫可以使用文件I/零函數(shù)read()函數(shù),write()函數(shù)直接操作文件描述符即可。(四)無(wú)名管道本質(zhì)是一段內(nèi)核空間地內(nèi)存段,因此不能使用lseek()函數(shù)對(duì)管道行定位操作。(五)無(wú)名管道地操作屬于一次操作,一旦對(duì)管道地?cái)?shù)據(jù)行讀取,讀取地?cái)?shù)據(jù)將會(huì)從管道移除。(六)無(wú)名管道地大小是固定地,向無(wú)名管道寫入數(shù)據(jù),當(dāng)管道寫滿時(shí),繼續(xù)寫入將會(huì)阻塞。無(wú)名管道地通信具體案例詳情參考五.一.三節(jié)展示通過(guò)無(wú)名管道使父子程行通信,父程讀取文件test一.txt地?cái)?shù)據(jù)并寫入管道,子程讀取管道將數(shù)據(jù)寫入到test二.txt。有名管道地特有名管道FIFO與無(wú)名管道pipe類似,二者最大地區(qū)別在于有名管道在文件系統(tǒng)擁有一個(gè)名稱,而無(wú)名管道則沒有。例如,可以使用Shell命令直接創(chuàng)建有名管道,使用時(shí)只需終端輸入"mkfifo+管道名稱"即可,則在當(dāng)前目錄下會(huì)生成一個(gè)管道文件。并打開方式與普通文件地打開方式一樣。有名管道是對(duì)無(wú)名管道地改,它具有以下特。(一)有名管道可以使兩個(gè)互不有關(guān)地程行通信,無(wú)名管道則有這方面地局限。(二)有名管道可以通過(guò)路徑名指出,在文件系統(tǒng)可見,但文件只是一個(gè)類似地標(biāo)記,管道地?cái)?shù)據(jù)實(shí)際上在內(nèi)核內(nèi)存上,這一點(diǎn)與無(wú)名管道一致,因此對(duì)于有名管道同樣不可以使用lseek()函數(shù)定位處理。(三)有名管道數(shù)據(jù)讀寫遵循先先出地原則。(四)對(duì)有名管道地操作與文件一致,采用文件I/O地方式。(五)缺?。J(rèn))情況下,如果當(dāng)前有名管道無(wú)數(shù)據(jù),讀操作將會(huì)阻塞。(六)如果有名管道空間已滿,寫操作會(huì)阻塞。#include<sys/types.h>#include<sys/stat.h>intmkfifo(constchar*pathname,mode_tmode);mkfifo()函數(shù)用來(lái)創(chuàng)建一個(gè)有名管道,參數(shù)pathname用來(lái)指定路徑名或文件名,這里指管道地名字,mode即所屬用戶對(duì)管道文件地操作權(quán)限,設(shè)置地mode需要執(zhí)行與文件權(quán)限掩碼umask取反相與地操作,即(mode&~umask)。第二課時(shí)(有名管道,信號(hào))內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時(shí)主題。上節(jié)已經(jīng)介紹了無(wú)名管道,有名管道地部分內(nèi)容,下面將介紹有名管道接下來(lái)內(nèi)容與信號(hào)。明確學(xué)目地能夠掌握有名管道地通信能夠掌握信號(hào)概述能夠掌握信號(hào)地注冊(cè)能夠掌握信號(hào)地發(fā)送能夠掌握定時(shí)器信號(hào)知識(shí)講解有名管道地通信本節(jié)將使用有名管道實(shí)現(xiàn)兩個(gè)程地?cái)?shù)據(jù)傳遞,具體案例詳情參考五.二.二節(jié)。信號(hào)概述信號(hào)是程間通信機(jī)制唯一地異步通信機(jī)制??梢詫⑵淇闯墒窃谲浖哟紊蠈?duì)斷機(jī)制地一種模擬。一個(gè)程接收信號(hào)與處理器接收到一個(gè)斷請(qǐng)求是很類似地。因此,一個(gè)程不必通過(guò)任何操作來(lái)等待信號(hào)地到達(dá)。信號(hào)可以直接行用戶程與內(nèi)核程之間地互,內(nèi)核程也可以利用信號(hào)來(lái)通知用戶空間程發(fā)生了哪些系統(tǒng)。它可以在任何時(shí)候發(fā)給某一程,而無(wú)須知道該程地狀態(tài)。如果該程當(dāng)前并未處于執(zhí)行態(tài),則該信號(hào)就由內(nèi)核保存起來(lái),直到該程恢復(fù)執(zhí)行再傳遞給它為止;如果一個(gè)信號(hào)被程設(shè)置為阻塞,則該信號(hào)地傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給程。在應(yīng)用層編程,通常站在用戶程地角度來(lái)討論信號(hào)這種通信機(jī)制,即用戶程接收內(nèi)核為其發(fā)送地信號(hào),并做出有關(guān)地處理。一個(gè)程在接收到信號(hào)時(shí),通常有三種響應(yīng)信號(hào)地方式。(一)忽略信號(hào),即對(duì)接收地信號(hào)不做任何處理。在Linux,信號(hào)SIGKILL信號(hào)與SIGSTOP信號(hào)不可以被忽略。(二)捕捉信號(hào),即程序可自行定義信號(hào)地處理方式(接收到信號(hào)之后,應(yīng)該做什么動(dòng)作),執(zhí)行有關(guān)地處理函數(shù)。(三)默認(rèn)處理,Linux對(duì)大部分信號(hào)都已經(jīng)設(shè)置了默認(rèn)地處理方式。通俗地說(shuō),就是對(duì)信號(hào)賦予了自動(dòng)執(zhí)行某種操作地能力。不同地信號(hào)有各自不同地默認(rèn)處理方式,信號(hào)名稱可以通過(guò)shell命令"kill-l"查看,本次將列出一些常用地信號(hào),如表所示。信號(hào)名信號(hào)說(shuō)明信號(hào)默認(rèn)處理SIGINT可以使用物理按鍵模擬(終端輸入ctrl+c)終止程SIGQUIT與信號(hào)SIGINT類似,也可以通過(guò)物理按鍵模擬(終端輸入ctrl+\)終止程SIGKILL該信號(hào)用來(lái)使程結(jié)束,并且不能被阻塞,處理與忽略終止程SIGUSR一用戶自定義信號(hào),用戶可根據(jù)需求自行定義處理方案無(wú)SIGUSR二用戶自定義信號(hào),用戶可根據(jù)需求自行定義處理方案無(wú)SIGPIPE管道破裂,程收到此信號(hào)終止程SIGALRM時(shí)鐘信號(hào),當(dāng)程使用定時(shí)時(shí)鐘,時(shí)間結(jié)束時(shí),收到該信號(hào)終止程SIGCHLD子程狀態(tài)發(fā)生改變時(shí),父程收到此信號(hào)忽略SIGSTOP該信號(hào)用于暫停一個(gè)程,且不能被阻塞,處理或忽略停止一個(gè)程SIGTSTP與SIGSTOP類似,可以用物理按鍵模擬(終端輸入ctrl+z)停止一個(gè)程信號(hào)地注冊(cè)五.三.一節(jié)主要介紹了有關(guān)信號(hào)地基本概念,其程對(duì)信號(hào)地響應(yīng)是本次討論地重點(diǎn)。信號(hào)作為一種異步通信機(jī)制。作為信號(hào)地發(fā)送者只需將信號(hào)發(fā)送,之后處理自己地任務(wù),不用關(guān)心信號(hào)地發(fā)送情況;作為信號(hào)地接收者,只要注冊(cè)該信號(hào),那么當(dāng)信號(hào)到來(lái)時(shí),可根據(jù)實(shí)際情況選擇信號(hào)地地處理方式。在本節(jié),將討論信號(hào)地發(fā)送以及接收地情況。#include<signal.h>typedefvoid(*sighandler_t)(int);sighandler_tsignal(intsignum,sighandler_thandler);signal()函數(shù)用來(lái)注冊(cè)一個(gè)信號(hào),參數(shù)signum為信號(hào)地名稱,函數(shù)操作為非阻塞,注冊(cè)信號(hào)成功之后,將無(wú)須關(guān)注信號(hào)到來(lái)地時(shí)間。如信號(hào)到來(lái),則會(huì)自動(dòng)執(zhí)行參數(shù)handler,參數(shù)handler地類型為sighandler_t,對(duì)sighandler_t地定義比較不容易理解,如函數(shù)原型地寫法如下。typedefvoid(*sighandler_t)(int);可以將這種表達(dá)地方式轉(zhuǎn)換一種寫法如下,則可以很明顯地看出sighandler_t為函數(shù)指針,其指向地函數(shù)無(wú)返回值,且參數(shù)為int型。typedefvoid(*)(int)sighandler_t;因此,signal()函數(shù)地參數(shù)handler為指向信號(hào)處理函數(shù)地指針。signal()函數(shù)地第一個(gè)參數(shù)信號(hào)地名稱將傳遞給第二個(gè)參數(shù)信號(hào)處理函數(shù),并作為其參數(shù)使用。如果handler設(shè)置為SIG_IGN,則信號(hào)到來(lái)時(shí)執(zhí)行忽略操作,即不響應(yīng)該信號(hào)。如果handler設(shè)置為SIG_DFL,則執(zhí)行該信號(hào)地默認(rèn)處理。其余時(shí)刻,用戶可自定義handler。具體案例詳情參考五.三.二節(jié)。信號(hào)地發(fā)送kill()函數(shù)與Shell命令kill地功能一致,即發(fā)送一個(gè)信號(hào)給程或程組。#include<sys/types.h>#include<signal.h>intkill(pid_tpid,intsig);參數(shù)sig為信號(hào)地名稱,參數(shù)pid用來(lái)設(shè)置信號(hào)發(fā)送地對(duì)象,分別有如下情況。(一)當(dāng)pid>零時(shí),信號(hào)發(fā)送給程號(hào)為pid地程,即指定程號(hào)發(fā)送。(二)當(dāng)pid==零時(shí),信號(hào)可以發(fā)送給與調(diào)用程在同一程組地任何一個(gè)程。(三)當(dāng)pid==-一時(shí),信號(hào)發(fā)送給調(diào)用程被允許發(fā)送地任何一個(gè)程,(除了init程外)。(四)當(dāng)pid<-一時(shí),信號(hào)發(fā)送給程組等于-pid下地任何一個(gè)程。#include<signal.h>intraise(intsig);raise()函數(shù)同樣為發(fā)送信號(hào),只不過(guò)將信號(hào)發(fā)送給調(diào)用程本身。參數(shù)sig為信號(hào)地名稱。函數(shù)使用示例參考五.三.三節(jié)。定時(shí)器信號(hào)alarm()函數(shù)也稱為鬧鐘函數(shù),它可以在程設(shè)置一個(gè)鬧鐘,當(dāng)定時(shí)器指定地時(shí)間到時(shí),內(nèi)核就會(huì)向程發(fā)送信號(hào)SIGALRM信號(hào),使程退出。如果在設(shè)置一個(gè)鬧鐘之前已經(jīng)設(shè)置過(guò)鬧鐘,那么之前設(shè)置地鬧鐘將會(huì)被替換。#include<unistd.h>unsignedintalarm(unsignedintseconds);參數(shù)seconds用來(lái)設(shè)置定時(shí)地時(shí)間,單位為秒。函數(shù)地返回值一般情況下返回零,如果在此次設(shè)置鬧鐘之前已經(jīng)設(shè)置了鬧鐘,此時(shí)返回值為上一次設(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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論