進程間通信就是在不同進程之間傳播或交換信息,那么不同進程之間存在著什么雙方都可以訪問的介質呢?進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內存區(qū)。
信號是UNIX中所使用的進程通信的一種最古老的方法。它是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發(fā)生了哪些系統(tǒng)事件。它可以在任何時候發(fā)給某一進程,而無需知道該進程的狀態(tài)。
在多任務操作系統(tǒng)環(huán)境下,多個進程會同時運行,并且一些進程之間可能存在一定的關聯(lián)。多個進程可能為了完成同一個任務會相互協(xié)作,這樣形成進程之間的同步關系。而且在不同進程之間,為了爭奪有限的系統(tǒng)資源(硬件或軟件資源)會進入競爭狀態(tài),這就是進程之間的互斥關系。
可以說,共享內存是一種最為高效的進程間通信方式。因為進程可以直接讀寫內存,不需要任何數(shù)據(jù)的復制。為了在多個進程間交換信息,內核專門留出了一塊內存區(qū)。這段內存區(qū)可以由需要訪問的進程將其映射到自己的私有地址空間。因此,進程就可以直接讀寫這一內存區(qū)而不需要進行數(shù)據(jù)的復制,從而大大提高了效率。
顧名思義,消息隊列就是一些消息的列表。用戶可以從消息隊列中添加消息和讀取消息等。從這點上看,消息隊列具有一定的FIFO特性,但是它可以實現(xiàn)消息的隨機查詢,比FIFO具有更大的優(yōu)勢。同時,這些消息又是存在于內核中的,由“隊列ID”來標識。
通過編寫有名管道多路通信實驗,讀者可進一步掌握管道的創(chuàng)建、讀寫等操作,同時,也復習使用select()函數(shù)實現(xiàn)管道的通信。
本章詳細講解了Linux中進程間通信的幾種機制,包括管道通信、信號通信、消息隊列、信號量以及共享內存機制等,并且講解了進程間通信的演進。
華清遠見為您帶來經(jīng)典教程:嵌入式Linux應用程序開發(fā)