Linux進(jìn)程間通訊課件_第1頁
Linux進(jìn)程間通訊課件_第2頁
Linux進(jìn)程間通訊課件_第3頁
Linux進(jìn)程間通訊課件_第4頁
Linux進(jìn)程間通訊課件_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux進(jìn)程間通訊Linux進(jìn)程間通訊Linux IPC概述信號(hào)(signal):親緣進(jìn)程和非親緣進(jìn)程都可以, 也可以進(jìn)程自己給自己遞送信號(hào)。信號(hào)量(semaphore):主要是線程間和親緣進(jìn)程間的同步手段,不做數(shù)據(jù)傳輸之用。命名信號(hào)量:可以在非親緣進(jìn)程間使用。管道:只允許親緣進(jìn)程間的通訊。命名管道(FIFO):除了親緣進(jìn)程可以通訊外,非親緣進(jìn)程也可以通訊。Linux IPC概述信號(hào)(signal):親緣進(jìn)程和非親緣Linux IPC概述共享內(nèi)存:多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的IPC方式。在進(jìn)程間傳遞數(shù)據(jù)時(shí)無須任何內(nèi)存的拷貝 。套接字:最通用的進(jìn)程間通訊方式,它提供了一種讓不同機(jī)器

2、上進(jìn)程間通訊方式。Linux IPC概述共享內(nèi)存:多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空管道管道是半雙工的,當(dāng)需要雙向通訊時(shí),需要兩個(gè)管道。只能用于父子進(jìn)程和兄弟進(jìn)程等有親緣關(guān)系的進(jìn)程。數(shù)據(jù)寫入時(shí),放在管道的結(jié)尾。數(shù)據(jù)讀取時(shí),從管道的頭開始讀取。管道管道是半雙工的,當(dāng)需要雙向通訊時(shí),需要兩個(gè)管道。管道#include int pipe(int pipefd2);pipe用來創(chuàng)建一個(gè)管道,這個(gè)管道用于父子進(jìn)程間的通訊。pipefd0是管道的讀端,pipefd1是管道的寫端。由于管道是單向的,所有一個(gè)進(jìn)程需要關(guān)閉寫端或者讀端。寫端不存在時(shí),讀端會(huì)收到文件結(jié)束符。讀端不存在時(shí),寫端會(huì)收到SIGPIPE信號(hào)。成

3、功返回0,失敗返回-1.缺點(diǎn):只能用于親緣進(jìn)程間通訊。管道#include 命名管道(FIFO)命名管道可以在所有進(jìn)程間使用,克服了管道只能在親緣進(jìn)程通訊的限制。命名管道與一個(gè)路徑名相關(guān)聯(lián),以文件的形式存在于文件系統(tǒng)中。只要能訪問該文件的進(jìn)程就可以使用命名管道。命名管道也是先進(jìn)先出,雖然以文件形式實(shí)現(xiàn)單不支持seek等操作。命名管道(FIFO)命名管道可以在所有進(jìn)程間使用,克服了管道創(chuàng)建FIFO#include #include int mkfifo(const char * pathname, mode_t mode) 第一個(gè)參數(shù)為路徑名,第二個(gè)為創(chuàng)建類型。跟create函數(shù)的參數(shù)一樣。進(jìn)程

4、只要打開這個(gè)文件,就可以往這個(gè)文件讀和寫。當(dāng)多個(gè)進(jìn)程往fifo里寫時(shí),linux只保證PIPE_BUF大小的字節(jié)數(shù)是原子的。成功返回0,失敗返回-1。創(chuàng)建FIFO#include popen#include FILE *popen(const char *command, const char *type);int pclose(FILE *stream);popen的作用相當(dāng)于創(chuàng)建一個(gè)管道,然后再fork一個(gè)子進(jìn)程,最后執(zhí)行命令。根據(jù)命令的不同這個(gè)管道是讀的或者寫的。失敗返回NULLpopen#include 共享內(nèi)存共享內(nèi)存是操作系統(tǒng)把同一塊物理內(nèi)存映射到不同進(jìn)程的地址空間。效率高,無須拷

5、貝 。多個(gè)進(jìn)程可以自由讀寫共享內(nèi)存,所以需要同步機(jī)制。mmapshmget、shmat、shmdt、shmctl共享內(nèi)存共享內(nèi)存是操作系統(tǒng)把同一塊物理內(nèi)存映射到不同進(jìn)程的地mmapvoid* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) mmap在進(jìn)程地址空間創(chuàng)建一個(gè)映射。它既可以把一個(gè)文件映射到內(nèi)存,也可以映射一塊內(nèi)存,實(shí)現(xiàn)進(jìn)程間內(nèi)存共享。addr為共享內(nèi)存的起始地址,為NULL時(shí),內(nèi)核會(huì)自動(dòng)選擇一個(gè)起始地址。length為共享內(nèi)存的長(zhǎng)度。prot指明了共享內(nèi)存保護(hù)狀態(tài):PRO

6、T_EXEC,PROT_READ,PROT_WRITE,PROT_NONEflags MAP_SHARED 共享此內(nèi)存,MAP_PRIVATE 只有該進(jìn)程可見。MAP_ANONYMOUS為匿名映射。mmapvoid* mmap ( void * addr ,系統(tǒng)v共享內(nèi)存有內(nèi)核維護(hù)共享內(nèi)存共享內(nèi)存一旦建立,一直保留在系統(tǒng)中。直到系統(tǒng)重啟或者共享內(nèi)存被移除。ipcs命令可以查看共享內(nèi)存,信號(hào)量等。系統(tǒng)v共享內(nèi)存有內(nèi)核維護(hù)共享內(nèi)存系統(tǒng)v共享內(nèi)存#include #include #include int shmget(key_t key, size_t size, int shmflg);void

7、 *shmat(int shmid, const void *shmaddr, int shmflg);int shmdt(const void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);key_t ftok(const char *pathname, int proj_id);ftok生成一個(gè)key,作為shmget的第一個(gè)參數(shù)。pathname必須為調(diào)用進(jìn)程可以訪問的。 proj_id的低8bit有效。pathname和proj_id共同組成一個(gè)key。系統(tǒng)v共享內(nèi)存#include 系統(tǒng)v共享內(nèi)存shmg

8、et 用來獲取指定size的共享內(nèi)存。第一個(gè)參數(shù)用來標(biāo)識(shí)共享內(nèi)存,第二個(gè)參數(shù)為共享內(nèi)存的大小,第三個(gè)參數(shù)shmflg有IPC_CREAT和IPC_EXCL,最為重要的是在shmflg中指明訪問權(quán)限,跟open的mode參數(shù)一樣。否則會(huì)出現(xiàn)permission denied等錯(cuò)誤。失敗返回-1。系統(tǒng)v共享內(nèi)存shmget 用來獲取指定size的共享內(nèi)存。系統(tǒng)v共享內(nèi)存shmat 把共享內(nèi)存映射到進(jìn)程空間。第一個(gè)參數(shù)為shmget的返回值,第二個(gè)參數(shù)可以為NULL,意味著有內(nèi)核來選擇映射的地址,第三個(gè)為映射到進(jìn)程空間時(shí)共享內(nèi)存的權(quán)限。shmdt解除進(jìn)程對(duì)共享內(nèi)存的映射。shmctl控制共享內(nèi)存。其中shmctl(shmid, IPC_RMID,0)用來從系統(tǒng)中移除共享內(nèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論