2011-12-21 第十五章 進(jìn)程間通訊第一節(jié) 引言1,過去,UNIX系統(tǒng)IPC是各種進(jìn)程通訊方式的統(tǒng)稱。2,套接字和STREAMS是僅有的兩種支持不同主機(jī)上各個(gè)進(jìn)程間IPC的類型。第二節(jié) 管道1,管道使用例程:int main(){int n,fd[2];pid_t pid;char line[MAXLINE];if(pipe(fd) < 0)err_sys("pipe error");if(pid = fork() < 0)err_sys("fock error");else if(pid > 0){close(fd[0]);write(fd[1],"hello world\n",12);} else {close(fd[1]);n = read(fd[0],line,MAXLINE);write(STDOUT_FILENO,line,n);}exit(0);}第三節(jié) popen和pclose函數(shù)1,這兩個(gè)函數(shù)實(shí)現(xiàn)的操作是:創(chuàng)建一個(gè)管道,調(diào)用fork產(chǎn)生一個(gè)子進(jìn)程,關(guān)閉管道的不使用端,執(zhí)行一個(gè)shell以運(yùn)行命令,然后等待命令終止。第四節(jié) 協(xié)同進(jìn)程1,當(dāng)一個(gè)程序產(chǎn)生某個(gè)過濾程序的輸入,同時(shí)又讀取該過濾程序的輸出時(shí),則該過濾程序就成為協(xié)同進(jìn)程。2,注意協(xié)同進(jìn)程的IO緩沖方式,以避免死鎖的產(chǎn)生。第五節(jié) FIFO1,F(xiàn)IFO有時(shí)被稱為命名管道。FIFO是一種文件類型。2,F(xiàn)IFO有下面兩種用途:a,F(xiàn)IFO由shell命令使用以便將數(shù)據(jù)從一條管道線傳送到另一條,為此無需創(chuàng)建中間臨時(shí)文件。b,F(xiàn)IFO用于客戶進(jìn)程-服務(wù)器進(jìn)程應(yīng)用程序中,以在客戶進(jìn)程和服務(wù)器進(jìn)程之間傳遞數(shù)據(jù)。3,管道只能用于進(jìn)程間的線性連接,然而,因?yàn)镕IFO具有名字,它可以用于非線性連接。第六節(jié) XSI IPC1,有三種IPC我們稱為XSI IPC,即消息隊(duì)列,信號量以及共享存儲器。2,以參數(shù)key和flag創(chuàng)建IPC結(jié)構(gòu),返回其標(biāo)識符,以其引用該IPC結(jié)構(gòu)。3,IPC_PRIVATE是鍵,IPC_CREATE和IPC_EXCL是flag的位標(biāo)志。4,XSI IPC為每一個(gè)IPC結(jié)構(gòu)設(shè)置了一個(gè)ipc_perm結(jié)構(gòu)。該結(jié)構(gòu)規(guī)定了權(quán)限和所有者。5,XSI IPC的主要問題是:a,IPC結(jié)構(gòu)是在系統(tǒng)范圍內(nèi)起作用的,沒有訪問計(jì)數(shù)。b,這些IPC結(jié)構(gòu)在文件系統(tǒng)中沒有名字。為了支持它們,不得不增加了十幾條新的系統(tǒng)調(diào)用和一些新的命令。c,IPC結(jié)構(gòu)不使用文件描述符,不能對它們使用多路轉(zhuǎn)接IO函數(shù)。第七節(jié) 消息隊(duì)列1,megget用于創(chuàng)建一個(gè)新的消息隊(duì)列或打開一個(gè)現(xiàn)存的隊(duì)列。2,msgsnd將數(shù)據(jù)放到消息隊(duì)列中。3,msgrcv從消息隊(duì)列中取用函數(shù)。4,msgctl對消息隊(duì)列指定執(zhí)行多種操作。5,在新的應(yīng)用程序中不應(yīng)當(dāng)再使用消息隊(duì)列。第八節(jié) 信號量1,信號量是一個(gè)計(jì)數(shù)器,用于安排多個(gè)進(jìn)程對共享數(shù)據(jù)對象的訪問。2,一個(gè)信號量控制一個(gè)共享資源的使用情況。3,使用信號量要先創(chuàng)建一個(gè)信號量集,調(diào)用函數(shù)semget。4,semctl函數(shù)包含了多種信號量的操作。5,函數(shù)semop自動原子性地執(zhí)行信號量集合上的操作數(shù)組。6,雖然記錄鎖慢于信號量,但如果只需鎖一個(gè)資源并且不需要使用XSI信號量的所有花銷功能,則寧可使用記錄鎖。理由是使用簡易,且進(jìn)程終止時(shí)系統(tǒng)會處理任何遺留下來的鎖。第九節(jié) 共享存儲1,共享存儲允許兩個(gè)或更多進(jìn)程共享一給定的存儲區(qū)。因?yàn)閿?shù)據(jù)不需要在客戶進(jìn)程和服務(wù)器之間復(fù)制,所以這是最快的一種IPC。2,使用共享存儲時(shí)需要掌握的唯一竅門是多個(gè)進(jìn)程之間對一給定存儲區(qū)的同步訪問。3,通常,信號量被用來實(shí)現(xiàn)對共享存儲訪問的同步。(記錄鎖也可以)。4,調(diào)用shmget獲得一個(gè)共享存儲標(biāo)識符。5,shmctl對共享存儲段執(zhí)行多種操作。6,共享存儲段創(chuàng)建之后就可以使用shmat連接它的地址空間。7,當(dāng)對共享存儲段的操作已經(jīng)結(jié)束的時(shí)候,調(diào)用shmdt脫接該段。8,使用存儲映射使用/dev/zero的優(yōu)點(diǎn)是:在調(diào)用mmap創(chuàng)建映射區(qū)之前,無需存在一個(gè)實(shí)際文件。其缺點(diǎn)是:只能在相關(guān)進(jìn)程間起作用。另外,對比/dev/zero的更好選擇,還可使用匿名存儲映射。第十節(jié) 客戶進(jìn)程-服務(wù)器進(jìn)程屬性1,客戶進(jìn)程和服務(wù)器進(jìn)程的某些屬性會受到它們之間所使用的IPC類型的影響。ps:2011年的最后一天算是第一次結(jié)束了這一章了。僅限勉強(qiáng)有個(gè)概念的程度。
| 只有注冊用戶登錄后才能發(fā)表評論。 | ||
|
||
|
相關(guān)文章:
|
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
|

