程序間通訊

2021-09-27 04:20:12 字數 3421 閱讀 5215

通俗來講在使用正在執行中程式時,不可避免需要在程式間通訊一些資料,這就是程序間通訊。

程序間通訊(ipc,interprocess communication)是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞、交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執行,程序之間必須互相通話。ipc介面就提供了這種可能性。每個ipc方法均有它自己的優點和侷限性。

程序間通訊的目的:

程序間通訊方式:

管道:實質是一種特殊檔案

管道特性:

半雙工通訊:可選擇方向的單向通訊

自帶同步與互斥特性

管道讀寫的特性:

匿名管道:只能用於父子程序之間的通訊

建立匿名管道:

int

pipe

(int fildes[2]

);//fildes[0]讀取檔案描述符 fildes[1]寫入檔案描述符

//使用時最好將不用的讀端/寫端關閉

管道存在於核心當中,其他的程序無法找到這個管道(獲取檔案描述符),所以只能通過有親緣關係的程序(fork()拷貝pcb),進行管道的訪問。

命名管道:可用於同一主機任意程序通訊

建立乙個命名管道:

//shell中

mkfifo filename

//程式中

intmkfifo

(const

char

*pathname, mode_t mode)

;//pathname:建立路徑名 mode:許可權

建立乙個管道檔案,本機所有程序可以通過開啟這個檔案從而訪問管道,開啟管道檔案用open。

管道檔案open的開啟特性:

//使用體現命名管道的使用

區別:匿名管道由pipe建立並開啟

命名管道由mkfifo建立,由open開啟。

訊息佇列

訊息傳輸過程中儲存訊息的佇列

//建立或訪問乙個訊息佇列:

intmsgget

(key_t key,

int msg***)

;//key:訊息佇列的名稱

//msg***:許可權

//訊息佇列的控制函式

intmsgctl

(int msqid,

int cmd,

struct msqid_ds *buf)

;//msqid:訊息佇列標識碼

//cmd:採取的動作

// ipc_stat 將msqid_ds結構中的資料設定為當前訊息佇列的關聯值

// ipc_set 擁有許可權的前提下,將訊息佇列的關聯值設定為msqid_ds資料結構中所給的值

// ipc_rmid 刪除訊息佇列

// ipc_info (linux-specific)

//新增訊息到訊息佇列中

intmsgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

;//msqid:訊息佇列標識碼

//msgp:指標,指向將要傳送的資訊

//msgsz:msgp指向資訊的長度

//msg***:控制當訊息佇列滿時要發生的事 ipc_nowait 佇列滿時不等待,返回eagain錯誤。

//從乙個訊息佇列中獲取訊息

ssize_t msgrcv

(int msqid,

void

*msgp, size_t msgsz,

long msgtyp,

int msg***)

;//msqid:訊息佇列標識碼

//msgp:指標,指向將要傳送的資訊

//msgsz:msgp指向資訊的長度

//msgtyp:實現接收優先順序的簡單形式

//msg***:控制佇列沒有相應型別的訊息可供接收時,要做的事

共享記憶體顧名思義:兩個或多個程序共享的儲存區

不需要核心態和使用者態的轉換,共享記憶體時最快的ipc。

訊號量

訊號量是乙個計數器,用於為多個程序提供共享資料物件的訪問。

為了獲取共享資源:

測試控制該資源的訊號量;

若此訊號量的值為正,則程序可以使用該資源。在這種情況下,程序會將訊號量值減1,表示它使用了乙個資源單位;

否則,若此訊號量的值為0,則程序進入休眠狀態,知道訊號量的值大於0。程序被喚醒後,返回步驟

//建立和訪問乙個訊號量集

intsemget

(key_t key,

int nsems,

int sem***)

;//控制訊號量集

intshmctl

(int shmid,

int cmd,

struct shmid_ds *buf)

;//對訊號量的操作,改變訊號量的值

intsemop

(int semid,

struct sembuf *sops,

unsigned nsops)

;

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