程序間通訊

2021-08-21 06:57:47 字數 1743 閱讀 1137

程序間通訊(ipc)

linux中實現程序間通訊的幾種方式:

管道建立訊息佇列:

msgget(key_t key, int flags);

key相當於檔名,

建立訊息佇列: ipc_creat | 0644

對應許可權 直接或上去, 如果只是想開啟 直接填0,否則填錯許可權 會導致開啟錯誤;

返回值是訊息佇列的id。相當於檔案描述符

訊息佇列按照不同的訊息型別收發資料

往訊息佇列中傳送資料

msgsnd

msgsnd(int id, id編號 mssget的返回值

const void *msgbuf, 要傳送的資訊在哪(結構體)

size_t len, 訊息的位元組數 不包括結構體中訊息型別(channel)的大小,

int flag); 傳送的flag 一般寫0

返回值:成功返回0,失敗返回-1

msgrcv 從訊息佇列中取資料, 取出來就拿走了,資料就不存在了

msgrcv(int id,

void *msgp, //取出來的小時放在這裡

size_t len, //裝訊息的大小,不包含訊息型別(通道號)。

long mytype, //取那個型別的訊息(通道號)

int flag, //一般寫0

);失敗返回-1,成功返回成功讀取的位元組數

當要取的訊息型別(通道號)不存在時,會阻塞住,等到另一端往該訊息型別(通道號)中寫入資料時,這一端才能取到資料, 取訊息按照佇列方式,先進先出方式。

***ctl()關閉 乾掉其中乙個佇列

共享記憶體

通過函式開啟的共享記憶體對映區,可用直接通過**內改變對映物理記憶體對應的值。

建立或開啟共享記憶體

#inlude

訊號量集:

建立或者開啟訊號量:

int semget(key_t key,

int nsems, //訊號量集中訊號量的個數

int flag, //開啟0,建立ipc_creat | 0644

) ipcs -s 檢視訊號量 最後乙個資訊是 訊號量個數,一般為1

設定訊號量初值:

semctl(int semid,

int semnum //訊號量中的第幾個訊號量

int cmd, //setval

su, //訊號量初值, 是個結構體

) 最後乙個引數是聯合體

union semun

檢視訊號量的值

semctl(semid,

int semnum, //訊號量中的第幾個訊號量

int cmd, //getval

0, )

返回值,當前訊號量的值。

pv操作:pv操作函式

semop( int semid.

struct sembuf sb, //結構體

int len, //

) semop(id, sb,1)

id, 陣列名, 陣列有幾個元素

結構體如下:

struct sembuf

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