C Linux之程序間通訊小結 待完善

2022-03-11 20:40:04 字數 1422 閱讀 1660

【此博文,待日後完善】

程序通訊方式:

1.管道通訊(匿名管道/命名管道)

2.訊息佇列

3.共享記憶體

4.訊號量

1.管道通訊

無名管道用於具有親緣關係程序間的通訊

管道是半雙工的,資料只能單向流動(雙方通訊需建立兩個管道)

管道只能用於父子程序或兄弟程序之間

管道對於管道兩端的程序而言就是乙個檔案,並單獨構成一種檔案系統,存在於記憶體中

寫管道的內容新增在管道緩衝區的末尾,讀管道則從緩衝區頭部讀出

有名管道在普通管道具備功能基礎上,通過給管道命名的方法變成管道檔案,允許無親緣關係程序間通過訪問管道檔案進行通訊

2.訊息佇列

也叫報文佇列,是訊息的鏈結表

有兩種型別的訊息佇列:posix訊息佇列和系統v訊息佇列

執行於同一臺機器上的程序間通訊,與管道類似

可以用流管道或套介面方式取代

系統v訊息佇列

int msgget( ); 建立乙個新佇列或開啟乙個存在的佇列

int msgsnd( ); 把訊息新增到msgid代表的訊息佇列的末尾,訊息的大小由msgsz指定。

int msgrcv( ); 從msgid代表的訊息佇列中取走乙個訊息。

int msgctl( ); 在由msgid標識的訊息佇列上執行cmd指定的操作。

3.共享記憶體

將同一塊記憶體區對映到共享它的不同程序的位址空間中

效率高:程序可以直接讀寫記憶體,不需任何資料拷貝,避免了核心空間與使用者空間的切換

核心未對共享記憶體的訪問提供同步機制,需要依靠某種同步機制來同步對共享程序的訪問

posix共享記憶體

通過使用者空間掛載的tmpfs檔案系統實現,持久化的

api:shm_open( )、mmap( )、munmap( )、shm_unlink( )等

system v共享記憶體

由核心本身的tmpfs實現,非持久化的

api:shmget( )、shmat( )、shmdt( )、shmctl( )等

4.訊號量

也稱訊號燈,用來協調不同程序間的資料物件

提供對程序間共享資源訪問控制的手段,用來保護共享資源

還可用於程序間及同一程序不同執行緒間的程序同步

兩種型別

二值訊號燈:取值只能為0或1,類似於互斥鎖

計算訊號燈:取值可以為任意非負值(受核心本身約束)

posix訊號量和system v訊號量(與共享記憶體的兩種方式類似)

[linux程序間通訊——使用命名管道]( 【命名管道講解得非常有條理性】

程序間 執行緒間通訊方式小結

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對共...

程序間 執行緒間通訊方式小結

之前一直對程序間和執行緒間的通訊方式搞混,今天對它們總結一下。管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 s...

程序間 執行緒間通訊方式小結

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對共...