程序間通訊的方式可謂是面試熱點,面試的時候也曾有幸被問到。當時呢是背的面試題,對程序間通訊的原理也不是很了解。今天呢就深入了解程序間的通訊。
首先捋一捋程序間的通訊有哪幾種方式:
socket
檔案管道
共享記憶體
訊號訊號量
訊息佇列
檔案:以磁碟作為資訊的載體。
示例:基本思想:
管道:以核心空間存放資訊。
管道又分為有名管道和匿名管道,有名管道用於無親緣關係的程序間通訊,而匿名管道則用於有親緣關係程序間通訊。
示例:基本思想:
// server.c
#include
#include
#include
#include
#include
#include
#include
intmain
(int argc,
char
* ar**)
unlink
(ar**[1]
);// 建立有名管道if(
共享記憶體是system v ipc
的一種,不依賴於程序的存在而存在。
以下三種型別的程序通訊方式(ipc
)合稱為system v ipc
:
共享記憶體的通訊效率比管道的效率更高。
共享記憶體的通訊原理圖如下所示:
共享記憶體的使用
建立(shmget
)
連線(shmat
)
讀寫(strcpy
、memcpy
)
解開連線(shmdt
)
刪除(shmctl
)
使用共享記憶體通訊呼叫上方的函式即可實現。
檔案
管道
共享記憶體
檔案:外存介入
命名管道:使用者態和核心態的轉換
共享記憶體:外存有可能介入
命名管道、共享記憶體:本機上的程序
檔案:不同機器上的程序
訊號量是乙個記憶體變數,可以被系統中的任何程序所訪問。
多個程序使用訊號量來協調對臨界資源的訪問。
linux
中訊號量是以集合的形式存在的,乙個集合中存在著多個訊號量。
訊號量的使用:
建立訊號量集(semget
)
執行pv
操作(semop
)
刪除訊號量集合(semctl
)
訊號量機制是為了協調多個程序對資源的使用,semop
操作對應於作業系統中的pv原語。但與作業系統中的訊號量有所不同:
訊號量機制中最小單位是訊號量集,並非單個整型數,訊號量集中的訊號量數目在建立該集合時指定。
建立訊號量集與對其賦初值這兩個操作是分開的,並非合在一起的原子操作,這是乙個致命的弱點。
有些程式在終止時並沒有釋放已經分配給它的訊號量集,sem_ undo
標識就是用來處理這些情況的。
訊號是核心傳送給某一程序的一種訊息。
如乙個正在執行的程式,我們按下ctrl + c
就可以終止該程式。
訊號機制linux
系統中用於程序之間相互通訊或操作的一種機制。
消費佇列,生產者、消費者的模式。如kafka
、rabbitmq
等,乙個程序複雜生產訊息,另乙個程序複雜消費訊息。
php程序間通訊 yoc PHP程序間通訊
php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...
程序間通訊
最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...