linux程式間通訊(IPC)小結
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
相關文章
- IPC-程式間通訊
- 微服務的程式間通訊(IPC)微服務
- linux環境程式設計(3): 使用POSIX IPC完成程式間通訊Linux程式設計
- 程式間通訊——XSI IPC之訊息佇列佇列
- IPC(InterProcess Communication):程序間通訊
- 程式間通訊——LINUXLinux
- Linux程式間通訊Linux
- Linux程式間通訊-eventfdLinux
- linux 程式間通訊之管道Linux
- Linux 的程式間通訊:管道Linux
- linux 程式間通訊之FIFOLinux
- Linux程式之間如何通訊?Linux
- 什麼是程式間通訊?Linux程式間通訊有幾種方式?Linux
- 程式間通訊是什麼?Linux程式間通訊有幾種方式?Linux
- Linux程式間通訊②:有名管道FIFOLinux
- linux程式間通訊--管道(PIPE & FIFO)Linux
- Linux 常見的六大 IPC 通訊方式Linux
- Java-執行緒間通訊小結Java執行緒
- Linux 程式間通訊之System V 訊號量Linux
- 程式間的八種通訊方式----共享記憶體是最快的 IPC 方式記憶體
- Binder通訊機制與IPC通訊.md
- Linux 程式間通訊的六種機制Linux
- Linux 下的程式間通訊:共享儲存Linux
- Linux程式間通訊之共享記憶體Linux記憶體
- linux 程式間通訊之System V 訊息佇列Linux佇列
- Linux 下的程式間通訊:套接字和訊號Linux
- 關於IPC-Message通訊
- electron-ipc通訊效能分析
- Linux程式間的通訊方式有哪些?Linux入門教程Linux
- Linux作業系統 程式之間的通訊Linux作業系統
- java web中jsp和action之間通訊小結JavaWebJS
- Linux環境程式設計程式間通訊機制理解Linux程式設計
- PHP程式間通訊PHP
- 程式間通訊(Socket)
- 程式間的通訊
- IPC Kit基礎入門:理解HarmonyOS的程序間通訊架構架構
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- android IPC 通訊(上)-sharedUserId&&MessengerAndroidMessenger