程序間通訊

2021-10-07 07:21:01 字數 3402 閱讀 8519

程序間通訊的方式可謂是面試熱點,面試的時候也曾有幸被問到。當時呢是背的面試題,對程序間通訊的原理也不是很了解。今天呢就深入了解程序間的通訊。

首先捋一捋程序間的通訊有哪幾種方式:

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

讀寫(strcpymemcpy

解開連線(shmdt

刪除(shmctl

使用共享記憶體通訊呼叫上方的函式即可實現。

檔案

管道

共享記憶體

檔案:外存介入

命名管道:使用者態和核心態的轉換

共享記憶體:外存有可能介入

命名管道、共享記憶體:本機上的程序

檔案:不同機器上的程序

訊號量是乙個記憶體變數,可以被系統中的任何程序所訪問。

多個程序使用訊號量來協調對臨界資源的訪問。

linux中訊號量是以集合的形式存在的,乙個集合中存在著多個訊號量。

訊號量的使用:

建立訊號量集(semget

執行pv操作(semop

刪除訊號量集合(semctl

訊號量機制是為了協調多個程序對資源的使用,semop操作對應於作業系統中的pv原語。但與作業系統中的訊號量有所不同:

訊號量機制中最小單位是訊號量集,並非單個整型數,訊號量集中的訊號量數目在建立該集合時指定。

建立訊號量集與對其賦初值這兩個操作是分開的,並非合在一起的原子操作,這是乙個致命的弱點。

有些程式在終止時並沒有釋放已經分配給它的訊號量集,sem_ undo標識就是用來處理這些情況的。

訊號是核心傳送給某一程序的一種訊息。

如乙個正在執行的程式,我們按下ctrl + c就可以終止該程式。

訊號機制linux系統中用於程序之間相互通訊或操作的一種機制。

消費佇列,生產者、消費者的模式。如kafkarabbitmq等,乙個程序複雜生產訊息,另乙個程序複雜消費訊息。

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...