進(jìn)程間通信又叫IPC (InterProcess Communication)是指在不同進(jìn)程之間傳播或交換信息。IPC的方式通常有管道(包括無(wú)名管道和命名管道)、消息隊(duì)列、信號(hào)量、共享存儲(chǔ)、Socket。 Socket支持不同主機(jī)上的兩個(gè)進(jìn)程IPC。
1,管道分為命名管道和無(wú)名管道,在內(nèi)核中申請(qǐng)一塊固定大小的緩沖區(qū),程序擁有寫入和讀取的權(quán)利,都可以看成一種特殊的文件,具有固定的讀端和寫端,也可以使用普通的read、write 等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中;無(wú)名管道一般使用fork函數(shù)實(shí)現(xiàn)父子進(jìn)程的通信,命名管道用于沒(méi)有血緣關(guān)系的進(jìn)程也可以進(jìn)程間通信;面向字節(jié)流、自帶同步互斥機(jī)制、半雙工,單向通信,兩個(gè)管道實(shí)現(xiàn)雙向通信。
2,消息隊(duì)列,在內(nèi)核中創(chuàng)建一隊(duì)列,隊(duì)列中每個(gè)元素是一個(gè)數(shù)據(jù)報(bào),不同的進(jìn)程可以通過(guò)句柄去訪問(wèn)這個(gè)隊(duì)列;消息隊(duì)列獨(dú)立于發(fā)送與接收進(jìn)程,可以通過(guò)順序和消息類型讀取,也可以fifo讀取;消息隊(duì)列可實(shí)現(xiàn)雙向通信。
3,信號(hào)量 , 在內(nèi)核中創(chuàng)建一個(gè)信號(hào)量集合(本質(zhì)是個(gè)數(shù)組),數(shù)組的元素(信號(hào)量)都是1,使用P操作進(jìn)行-1,使用V操作+1,通過(guò)對(duì)臨界資源進(jìn)行保護(hù)實(shí)現(xiàn)多進(jìn)程的同步
4,共享內(nèi)存,將同一塊物理內(nèi)存一塊映射到不同的進(jìn)程的虛擬地址空間中,實(shí)現(xiàn)不同進(jìn)程間對(duì)同一資源的共享。目前最快的IPC形式,不用從用戶態(tài)到內(nèi)核態(tài)的頻繁切換和拷貝數(shù)據(jù),直接從內(nèi)存中讀取就可以,共享內(nèi)存是臨界資源,所以需要操作時(shí)必須要保證原子性。使用信號(hào)量或者互斥鎖都可以。
5,socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口,把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對(duì)用戶來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓Socket去組織數(shù)據(jù)。socket起源于UNIX,在Unix一切皆文件哲學(xué)的思想下,socket是一種”打開(kāi)—讀/寫—關(guān)閉”模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)”文件”,在建立連接打開(kāi)后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。是一種可以網(wǎng)間通信的方式。