程序間通訊(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...