|  | |
| Linux下進程間通信 | |
| 本文關鍵字: linux進程間通信,linux 進程通信 通過前面的(de)(de)(de)學習(xi),讀者已(yi)經知道(dao)了進程是(shi)一個(ge)程序的(de)(de)(de)一次執行(xing),是(shi)系統資源分配(pei)的(de)(de)(de)小單元(yuan)。這里所(suo)說的(de)(de)(de)進程一般是(shi)指運(yun)行(xing)在用(yong)戶(hu)態(tai)的(de)(de)(de)進程,而(er)由于(yu)處(chu)于(yu)用(yong)戶(hu)態(tai)的(de)(de)(de)不同(tong)進程間是(shi)彼此隔(ge)離(li)的(de)(de)(de),就像處(chu)于(yu)不同(tong)城市的(de)(de)(de)人(ren)們(men),他們(men)必須通過某(mou)種(zhong)方(fang)式來進行(xing)通信(xin)(xin),例如人(ren)們(men)現(xian)在廣泛使用(yong)的(de)(de)(de)手機(ji)等方(fang)式。本章將講述如何建(jian)立這些(xie)不同(tong)的(de)(de)(de)通信(xin)(xin)方(fang)式,就像人(ren)們(men)有多種(zhong)通信(xin)(xin)方(fang)式一樣。 Linux下(xia)的(de)進(jin)(jin)程(cheng)(cheng)通(tong)(tong)信(xin)手(shou)段基本(ben)上(shang)(shang)是從UNIX平臺(tai)上(shang)(shang)的(de)進(jin)(jin)程(cheng)(cheng)通(tong)(tong)信(xin)手(shou)段繼(ji)承(cheng)而(er)來的(de)。而(er)對(dui)(dui)UNIX發展做出(chu)重(zhong)大(da)貢獻的(de)兩大(da)主力AT&T的(de)貝爾實驗室及(ji)BSD(加州(zhou)大(da)學伯(bo)克利(li)分校的(de)伯(bo)克利(li)軟(ruan)件發布中心)在進(jin)(jin)程(cheng)(cheng)間的(de)通(tong)(tong)信(xin)方面的(de)側重(zhong)點有所不同。前者(zhe)是對(dui)(dui)UNIX早期的(de)進(jin)(jin)程(cheng)(cheng)間通(tong)(tong)信(xin)手(shou)段進(jin)(jin)行了系(xi)統的(de)改進(jin)(jin)和擴充,形(xing)成了“System V IPC”,其通(tong)(tong)信(xin)進(jin)(jin)程(cheng)(cheng)主要局(ju)限在單個計算機內;后者(zhe)則跳(tiao)過(guo)了該限制(zhi),形(xing)成了基于(yu)套接(jie)口(Socket)的(de)進(jin)(jin)程(cheng)(cheng)間通(tong)(tong)信(xin)機制(zhi)。而(er)Linux則把兩者(zhe)的(de)優(you)勢都繼(ji)承(cheng)下(xia)來,如圖4.1所示。 
 ● UNIX進程間通信(IPC)方式包括(kuo)管(guan)道、FIFO及信號。 ● System V進程間通信(IPC)包(bao)括System V消息隊列、System V信號量(liang)及System V共享內存區。     ● Posix 進程間通信(IPC)包括Posix消息隊列、Posix信號量及Posix共享內存區。 ● 管道(Pipe)及有名管道(Named Pipe):管(guan)道(dao)(dao)可用于具(ju)有(you)親緣(yuan)關系進程(cheng)間的通(tong)信。有(you)名管(guan)道(dao)(dao)除具(ju)有(you)管(guan)道(dao)(dao)所具(ju)有(you)的功能外,還(huan)允(yun)許無親緣(yuan)關系進程(cheng)間的通(tong)信。 ● 信號(Signal):信號(hao)是在軟件層(ceng)次上對中斷機制(zhi)的一種模(mo)擬,它(ta)是比較復雜(za)的通信方式,用于通知(zhi)進程有(you)某事件發生,一個進程收到一個信號(hao)與處理(li)器收到一個中斷請求效果上可(ke)以說(shuo)是一樣的。 ● 消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)(Messge Queue):消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)是消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)的(de)鏈(lian)接表,包括(kuo)Posix消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)和System V消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)。它克服了前兩種通信方式中信息(xi)(xi)(xi)(xi)(xi)量有(you)(you)限的(de)缺點,具有(you)(you)寫權限的(de)進程(cheng)可以按照一定的(de)規則向消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)中添加新消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi);對消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)有(you)(you)讀(du)權限的(de)進程(cheng)則可以從消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)隊(dui)(dui)(dui)列(lie)(lie)中讀(du)取消(xiao)(xiao)息(xi)(xi)(xi)(xi)(xi)。 ● 共(gong)享內(nei)(nei)存(cun)(cun)(Shared Memory):可以(yi)說這是有效的進(jin)程(cheng)間通信(xin)(xin)方式(shi)。它使得(de)多個進(jin)程(cheng)可以(yi)訪(fang)問同(tong)一塊內(nei)(nei)存(cun)(cun)空間,不同(tong)進(jin)程(cheng)可以(yi)及時看到對(dui)方進(jin)程(cheng)中對(dui)共(gong)享內(nei)(nei)存(cun)(cun)中數據(ju)的更(geng)新。這種(zhong)通信(xin)(xin)方式(shi)需要依靠某種(zhong)同(tong)步機制,如互斥鎖和信(xin)(xin)號(hao)量(liang)等。   ● 信號量(Semaphore):主要作為進程(cheng)(cheng)之(zhi)間及同一進程(cheng)(cheng)的(de)不(bu)同線程(cheng)(cheng)之(zhi)間的(de)同步(bu)和互斥手段。 ● 套接字(Socket):這(zhe)是(shi)一種更(geng)為一般的進(jin)程間(jian)(jian)(jian)通(tong)信機(ji)制,它可(ke)用(yong)于(yu)網絡中不同機(ji)器(qi)之間(jian)(jian)(jian)的進(jin)程間(jian)(jian)(jian)通(tong)信,應用(yong)非常(chang)廣(guang)泛。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接:  
         1、實驗:編寫守護進程 |