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