通俗來講在使用正在執行中程式時,不可避免需要在程式間通訊一些資料,這就是程序間通訊。
程序間通訊(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...