linux程式間通訊(IPC)小結

許佳佳233發表於2018-09-25

原文地址:https://www.jianshu.com/p/c1015f5ffa74

linux IPC型別

1、匿名管道
2、命名管道
3、訊號
4、訊息佇列
5、共享記憶體
6、訊號量
7、Socket

1、匿名管道

在這裡插入圖片描述
過程:
1、管道實質是一個核心緩衝區,先進先出(佇列)讀取緩衝區記憶體資料
2、一個資料只能讀一次,讀完後在緩衝區就不存在了。
3、當緩衝區讀空或者寫滿時,相應的讀程式或者寫程式會進入等待佇列,在有新資料寫入或者有資料被讀出來時,就喚醒等待佇列中的程式。

特點:
1、只支援單向資料流(兩個程式如果要雙向讀寫,需要建立兩個管道)
2、只能用於具有親緣關係的程式之間
3、緩衝區大小有限
4、傳輸的是無格式位元組流,收發方需要約定格式。
5、內容都存於記憶體中。

2、命名管道

過程和匿名管道類似。
它提供了一個路徑名與之關聯,以有名管道的檔案形式存在於檔案系統中,這樣,即使與有名管道的建立程式不存在親緣關係的程式,只要可以訪問該路徑,就能夠彼此通過有名管道相互通訊。

特點:
1、只支援單向資料流
2、能用於任意兩個程式之間通訊(和匿名管道區別)
3、緩衝區大小有限
4、傳輸的是無格式位元組流,收發方需要約定格式。
5、有名管道的名字存在於檔案系統中,內容存放在記憶體中。(和匿名管道區別)

3、訊號

訊號是軟體層次上對中斷機制的一種模擬,是一種非同步通訊方式,訊號可以在使用者空間程式和核心之間直接互動,核心可以利用訊號來通知使用者空間的程式發生了哪些系統事件,訊號事件主要有兩個來源:
1、硬體來源:使用者按鍵輸入Ctrl+C退出、硬體異常如無效的儲存訪問等。
2、軟體終止:終止程式訊號、其他程式呼叫kill函式、軟體異常產生訊號。

Linux系統中常用訊號:
(1)SIGHUP:使用者從終端登出,所有已啟動程式都將收到該程式。系統預設狀態下對該訊號的處理是終止程式。
(2)SIGINT:程式終止訊號。程式執行過程中,按Ctrl+C鍵將產生該訊號。
(3)SIGQUIT:程式退出訊號。程式執行過程中,按Ctrl+\\鍵將產生該訊號。
(4)SIGBUS和SIGSEGV:程式訪問非法地址。
(5)SIGFPE:運算中出現致命錯誤,如除零操作、資料溢位等。
(6)SIGKILL:使用者終止程式執行訊號。shell下執行kill -9傳送該訊號。
(7)SIGTERM:結束程式訊號。shell下執行kill 程式pid傳送該訊號。
(8)SIGALRM:定時器訊號。
(9)SIGCLD:子程式退出訊號。如果其父程式沒有忽略該訊號也沒有處理該訊號,則子程式退出後將形成殭屍程式。

4、訊息佇列

訊息佇列是存放在核心中的訊息連結串列。程式可以通過傳送訊息和接收訊息來程式通訊,同樣遵守先進先出的原則。
類比於,ios中dispatch的queue,android中MessageQueue。

特點:
1、訊息佇列也獨立於傳送和接收程式而存在。可以多個程式之間通訊。
2、避免管道的同步和阻塞問題,不需要程式自己來控制同步操作。
3、接收程式可以通過訊息型別有選擇地接收資料,而不是像命名管道中那樣,只能預設地先進先出的接收。

5、共享記憶體

為了在多個程式間交換資訊,核心專門留出了一塊記憶體區,可以由需要訪問的程式將其對映到自己的私有地址空間。程式就可以直接讀寫這一塊記憶體而不需要進行資料的拷貝,從而大大提高效率。

特點:
1、是最快的可用IPC形式,是針對其他通訊機制執行效率較低而設計的。
2、由於多個程式共享一段記憶體,因此需要依靠某種同步機制(如訊號量)來達到程式間的同步及互斥。

6、訊號量

訊號量是一個計數器,用於多程式對共享資料的訪問,訊號量的意圖在於程式間同步
為了獲得共享資源,程式需要執行下列操作:
(1)建立一個訊號量: 這要求呼叫者指定初始值,對於二值訊號量來說,它通常是1,也可是0。
(2)等待一個訊號量: 該操作會測試這個訊號量的值,如果小於0,就阻塞。也稱為P操作。
(3)掛出一個訊號量: 該操作將訊號量的值加1,也稱為V操作。

訊號量與互斥量之間的區別:
互斥量值只能為0/1,訊號量值可以為非負整數。
也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成一個資源的互斥訪問。

7、Socket

在這裡插入圖片描述

相關文章