進(jìn)程間通信的概念
每個(gè)進(jìn)程各自有不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到。因此,進(jìn)程之間要交換數(shù)據(jù)必須通過(guò)內(nèi)核,在內(nèi)核中開(kāi)辟一塊緩沖區(qū),進(jìn)程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進(jìn)程2再?gòu)膬?nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信 IPC(InterProcess Communication)。
進(jìn)程間通信的應(yīng)用場(chǎng)景
(1)數(shù)據(jù)傳輸
一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程,發(fā)送的數(shù)據(jù)量在一個(gè)字節(jié)到幾兆字節(jié)之間。
(2)共享數(shù)據(jù)
多個(gè)進(jìn)程想要操作共享數(shù)據(jù),一個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的修改,別的進(jìn)程應(yīng)該立刻看到。
(3)通知事件
一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件。
(4)資源共享
多個(gè)進(jìn)程之間共享同樣的資源,需要內(nèi)核提供鎖和同步機(jī)制。
(5)進(jìn)程控制
有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程),此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變。
1.管道
管道是通過(guò)調(diào)用 pipe 函數(shù)創(chuàng)建的,fd[0] 用于讀,fd[1] 用于寫。
#include <unistd.h>
int pipe(intfd[2]);
限制:①只支持半雙工通信(單向交替?zhèn)鬏敚虎谥荒茉诟缸舆M(jìn)程或者兄弟進(jìn)程中使用。
2.FIFO
FIFO也稱為管道,與上述管道不同的是沒(méi)有只能在父子進(jìn)程中使用的限制。
#include<sys/stat.h>
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);
FIFO 常用于客戶-服務(wù)器應(yīng)用程序中,F(xiàn)IFO 用作匯聚點(diǎn),在客戶進(jìn)程和服務(wù)器進(jìn)程之間傳遞數(shù)據(jù)。
3.消息隊(duì)列
消息隊(duì)列是存放在內(nèi)核中的消息鏈表,每個(gè)消息隊(duì)列由消息隊(duì)列標(biāo)識(shí)符表示。
①?消息隊(duì)列允許一個(gè)或多個(gè)進(jìn)程向它寫入與讀取消息。
②?管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則
③消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
4.信號(hào)量
信號(hào)量是是一個(gè)計(jì)數(shù)器,用于多個(gè)進(jìn)程之間訪問(wèn)共享數(shù)據(jù),即進(jìn)程間同步。
工作機(jī)制:信號(hào)量的初值(>0),每當(dāng)有進(jìn)程申請(qǐng)使用信號(hào)量,通過(guò)一個(gè)P操作來(lái)對(duì)信號(hào)量進(jìn)行-1操作。當(dāng)計(jì)數(shù)器減到0的時(shí)候就說(shuō)明沒(méi)有資源了,其他進(jìn)程要想訪問(wèn)就必須等待。當(dāng)該進(jìn)程執(zhí)行完之后,就會(huì)執(zhí)行V操作來(lái)對(duì)信號(hào)量進(jìn)行+1操作。
5.共享內(nèi)存
多個(gè)進(jìn)程可以直接讀寫同一塊內(nèi)存空間(最快的 IPC )。
工作機(jī)制:將不同進(jìn)程的虛擬內(nèi)存地址映射到相同的物理內(nèi)存地址,實(shí)現(xiàn)共享內(nèi)存。內(nèi)核有一塊內(nèi)存區(qū),可以將進(jìn)程的私有地址空間映射到該內(nèi)存區(qū),因此進(jìn)程間可以直接讀寫這一塊內(nèi)存而不需要進(jìn)行數(shù)據(jù)的拷貝。
6.套接字socket
套接字socket是一種通信機(jī)制,實(shí)現(xiàn)進(jìn)程間(本地/跨網(wǎng)絡(luò))的通信。socket是應(yīng)用層和傳輸層之間的橋梁。
socket通信的基本流程如下: