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