linux進(jìn)程間通信的3種方式:1、管道通信,發(fā)送信息的進(jìn)程稱為寫進(jìn)程,接收信息的進(jìn)程稱為讀進(jìn)程。2、消息緩沖通信,以消息緩沖區(qū)為中間介質(zhì),通信雙方的發(fā)送和接收操作均以消息為單位。3、共享內(nèi)存通信。
本教程操作環(huán)境:Ubuntu 16.04系統(tǒng)、Dell G3電腦。
linux 進(jìn)程間通信的3種方式
由于不同的進(jìn)程運(yùn)行在各自不同的內(nèi)存空間中.一方對(duì)于變量的修改另一方是無(wú)法感知的.因此.進(jìn)程之間的信息傳遞不可能通過(guò)變量或其它數(shù)據(jù)結(jié)構(gòu)直接進(jìn)行,只能通進(jìn)程間通信來(lái)完成。
根據(jù)進(jìn)程通信時(shí)信息量大小的不同,可以將進(jìn)程通信劃分為兩大類型:控制信息的通信和大批數(shù)據(jù)信息的通信.前者稱為低級(jí)通信,后者稱為高級(jí)通信。
低級(jí)通信主要用于進(jìn)程之間的同步、互斥、終止、掛起等等控制信息的傳遞。
高級(jí)通信主要用于進(jìn)程間數(shù)據(jù)塊的交換和共享 常見(jiàn)的高級(jí)通信有管道(PIPE)、消息隊(duì)列(MESSAGE)、共享內(nèi)存(SHARED MEM0RY)等。
這里主要比較一下高級(jí)通信的這三種方式的特點(diǎn)。
管道通信(PIPE)
兩個(gè)進(jìn)程利用管道進(jìn)行通信時(shí).發(fā)送信息的進(jìn)程稱為寫進(jìn)程.接收信息的進(jìn)程稱為讀進(jìn)程。管道通信方式的中間介質(zhì)就是文件.通常稱這種文件為管道文件.它就像管道一樣將一個(gè)寫進(jìn)程和一個(gè)讀進(jìn)程連接在一起,實(shí)現(xiàn)兩個(gè)進(jìn)程之間的通信。寫進(jìn)程通過(guò)寫入端(發(fā)送端)往管道文件中寫入信息;讀進(jìn)程通過(guò)讀出端(接收端)從管道文件中讀取信息。兩個(gè)進(jìn)程協(xié)調(diào)不斷地進(jìn)行寫和讀,便會(huì)構(gòu)成雙方通過(guò)管道傳遞信息的流水線。
利用系統(tǒng)調(diào)用PIPE()可以創(chuàng)建一個(gè)無(wú)名管道文件,通常稱為無(wú)名管道或PIPE;利用系統(tǒng)調(diào)用MKNOD()可以創(chuàng)建一個(gè)有名管道文件.通常稱為有名管道或FIFO。無(wú)名管道是一種非永
久性的管道通信機(jī)構(gòu).當(dāng)它訪問(wèn)的進(jìn)程全部終止時(shí),它也將隨之被撤消。無(wú)名管道只能用在具有家族聯(lián)系的進(jìn)程之間。有名管道可以長(zhǎng)期存在于系統(tǒng)之中.而且提供給任意關(guān)系的進(jìn)程使用,但是使用不當(dāng)容易導(dǎo)致出錯(cuò).所以操作系統(tǒng)將命名管道的管理權(quán)交由系統(tǒng)來(lái)加以控制管道文件被創(chuàng)建后,可以通過(guò)系統(tǒng)調(diào)用WRITE()和READ()來(lái)實(shí)現(xiàn)對(duì)管道的讀寫操作;通信完后,可用CLOSE()將管道文件關(guān)閉。
消息緩沖通信(MESSAGE)
多個(gè)獨(dú)立的進(jìn)程之間可以通過(guò)消息緩沖機(jī)制來(lái)相互通信.這種通信的實(shí)現(xiàn)是以消息緩沖區(qū)為中間介質(zhì).通信雙方的發(fā)送和接收操作均以消息為單位。在存儲(chǔ)器中,消息緩沖區(qū)被組織成隊(duì)列,通常稱之為消息隊(duì)列。消息隊(duì)列一旦創(chuàng)建后即可由多進(jìn)程共享.發(fā)送消息的進(jìn)程可以在任意時(shí)刻發(fā)送任意個(gè)消息到指定的消息隊(duì)列上,并檢查是否有接收進(jìn)程在等待它所發(fā)送的消息。若有則喚醒它:而接收消息的進(jìn)程可以在需要消息的時(shí)候到指定的消息隊(duì)列上獲取消息.如果消息還沒(méi)有到來(lái).則轉(zhuǎn)入睡眠狀態(tài)等待。
共享內(nèi)存通信(SHARED MEMORY)
針對(duì)消息緩沖需要占用CPU進(jìn)行消息復(fù)制的缺點(diǎn).OS提供了一種進(jìn)程間直接進(jìn)行數(shù)據(jù)交換的通信方式一共享內(nèi)存 顧名思義.這種通信方式允許多個(gè)進(jìn)程在外部通信協(xié)議或同步,互斥機(jī)制的支持下使用同一個(gè)內(nèi)存段(作為中間介質(zhì))進(jìn)行通信.它是一種最有效的數(shù)據(jù)通信方式,其特點(diǎn)是沒(méi)有中間環(huán)節(jié).直接將共享的內(nèi)存頁(yè)面通過(guò)附接.映射到相互通信的進(jìn)程各自的虛擬地址空間中.從而使多個(gè)進(jìn)程可以直接訪問(wèn)同一個(gè)物理內(nèi)存頁(yè)面.如同訪問(wèn)自己的私有空間一樣(但實(shí)質(zhì)上不是私有的而是共享的)。因此這種進(jìn)程間通信方式是在同一個(gè)計(jì)算機(jī)系統(tǒng)中的諸進(jìn)程間實(shí)現(xiàn)通信的最快捷的方法.而它的局限性也在于此.即共享內(nèi)存的諸進(jìn)程必須共處同一個(gè)計(jì)算機(jī)系統(tǒng).有物理內(nèi)存可以共享才行。
三種方式的特點(diǎn)(優(yōu)缺點(diǎn)):
1.無(wú)名管道簡(jiǎn)單方便.但局限于單向通信的工作方式.并且只能在創(chuàng)建它的進(jìn)程及其子孫進(jìn)程之間實(shí)現(xiàn)管道的共享:有名管道雖然可以提供給任意關(guān)系的進(jìn)程使用.但是由于其長(zhǎng)期存在于系統(tǒng)之中,使用不當(dāng)容易出錯(cuò)。
2.消息緩沖可以不再局限于父子進(jìn)程.而允許任意進(jìn)程通過(guò)共享消息隊(duì)列來(lái)實(shí)現(xiàn)進(jìn)程間通信.并由系統(tǒng)調(diào)用函數(shù)來(lái)實(shí)現(xiàn)消息發(fā)送和接收之間的同步.從而使得用戶在使用消息緩沖進(jìn)行通信時(shí)不再需要考慮同步問(wèn)題.使用方便,但是信息的復(fù)制需要額外消耗CPU的時(shí)間.不適宜于信息量大或操作頻繁的場(chǎng)合。
3.共享內(nèi)存針對(duì)消息緩沖的缺點(diǎn)改而利用內(nèi)存緩沖區(qū)直接交換信息,無(wú)須復(fù)制,快捷、信息量大是其優(yōu)點(diǎn)。但是共享內(nèi)存的通信方式是通過(guò)將共享的內(nèi)存緩沖區(qū)直接附加到進(jìn)程的虛擬地址空間中來(lái)實(shí)現(xiàn)的.因此,這些進(jìn)程之間的讀寫操作的同步問(wèn)題操作系統(tǒng)無(wú)法實(shí)現(xiàn)。必須由各進(jìn)程利用其他同步工具解決。另外,由于內(nèi)存實(shí)體存在于計(jì)算機(jī)系統(tǒng)中.所以只能由處于同一個(gè)計(jì)算機(jī)系統(tǒng)中的諸進(jìn)程共享。不方便網(wǎng)絡(luò)通信。