程序間通訊

2021-10-01 01:45:11 字數 3782 閱讀 1357

在不同的程序之間傳播或交換資訊,讓不同的程序看到相同的檔案資源

匿名管道

#include int pipe(int fd[2]);//建立匿名管道

//fd:檔案描述符,fd[0]表示讀端,fd[1]表示寫端

//成功返回0,失敗返回錯誤碼

命名管道

$ mkfifo filename

#include #include int mkfifo(const char* filename, mode_t mode);

//成功返回0,失敗返回-1

匿名管道與命名管道

管道特點

struct ipc_perm;
#include #include key_t ftok(const char* filename, int id);
訊息佇列

struct msgbuf;
struct msqid_ds;
建立

int msgget(key_t key, int msg***);

//建立和訪問乙個訊息佇列

//key:訊息佇列的名字,msg***:用法和建立檔案時的mode一樣

//成功返回訊息佇列的必標識碼,失敗返回-1

int msgclt(int msqid, int cmd, struct msqid_ds *buf);

//訊息佇列的控制函式

//msqid:訊息佇列的標識碼,cmd:將要採取的動作,有以下值

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

//ipc_set:若程序有足夠許可權,把訊息佇列的當前關聯值設定為msqid_ds資料結構的值

//ipc_rmid:刪除訊息佇列

//buf:指向儲存訊息佇列的模式狀態和訪問許可權的資料結構

//成功返回0,失敗返回-1

int msgsnd(int msqid, const void* msgp, size_t msgsz, int msg***);

//把一條訊息新增到訊息佇列中

//msgp:指向準備發出的訊息,msgsz:msgp指向訊息的長度,不包括long int型

//msg***:控制佇列滿或達到系統上限時發生的事情,有以下值

//ipc_nowait:表示佇列滿不等待,返回eagain錯誤,msg_noerror:訊息大小超過msgsz截斷

//成功返回0,失敗返回-1

ssize_t msgrcv(int msqid, void* msgp, size_t msgsz, long msgtype, int msg***);

//從乙個訊息佇列接收訊息

//msgtype:實現接收優先順序,有以下值

//0:返回第一條訊息,大於0:返回第一條型別等於msgtype的訊息

//小於0:返回佇列第一條型別小於msgtyp絕對值並且訊息型別最小的訊息

//大於0且msg***=msg_except:接收型別不等於msgtype的第一條訊息

//成功返回實際放到接收緩衝區的字元個數,失敗返回-1

ipcs和ipcrm

共享記憶體

struct shmid_ds;
建立

int shmget(key_t key, size_t size, int shm***);

//建立共享記憶體

//key:共享記憶體的名字,size:共享記憶體的大小,shm***:用法和建立檔案時的mode一樣

//成功返回共享記憶體的標識碼,失敗返回-1

int shmctl(int shmid, int cmd, struct shmid_ds* buf);

//共享記憶體的控制函式

//shmid:共享記憶體標識碼,cmd:將要採取的動作,有以下值

//ipc_stat:把shmid_ds結構中的資料設定為共享記憶體當前關聯值

//ipc_set:若程序許可權足夠,把共享記憶體的當前關連值設定為shmid_ds資料結構中的值

//ipc_rmid:刪除共享記憶體段

//buf:指向儲存共享記憶體的模式狀態和訪問許可權的資料結構

//成功返回0,失敗返回-1

void* shmat(int shmid, const void* shmaddr, itn shm***);

//將共享記憶體段連線到位址空間

//shmaddr指定鏈結位址,shmaddr為null,核心自動選擇乙個位址

//shmaddr不為null且shm***無shm_rnd標記,則以shmaddr為連線位址

//shmaddr不為null且shm***設定shm_rnd標記,則連線位址會自動向下調整為shmlba的整數倍(shmaddr-shmaddr%shmlba)

//成功返回指向共享記憶體第一節的指標,失敗返回-1

int shmdt(const void* shmaddr);

//將共享記憶體與當前程序脫離,不刪除共享記憶體段

//成功返回0,失敗返回-1

訊號量

struct semaphore;
struct semid_ds;
p(s)

}

v(s)

}

建立

int semget(key_t key, int nsems, int sem***);

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

//key:訊號量集的名字,nsems:訊號量集中訊號量的個數,sem***:用法和建立檔案時的mode一樣

//成功返回訊號量集的表示碼,失敗返回-1

int semctl(int semid, int semnum, int cmd, ...);

//訊號量的控制函式

//semid:訊號量標識碼,semnum:訊號量集訊號量的序號,cmd:將要採取的動作,有以下值

//setval:設定訊號集中訊號量計數值,getval:獲取訊號集訊號量的計數值

//ipc_stat:把semid_ds結構中的資料設定為訊號集當前關聯值

//ipc_set:若程序許可權足夠,把訊號集的當前關聯值設定為semid_ds資料結構中給出的值

//ipc_rmid:刪除訊號集

//成功返回0,失敗返回-1

int semop(int semid, struct sembuf* sops, unsigned nsops);

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

//sops:指向乙個結構數值的指標,nsops:訊號量的個數

//成功返回0,失敗返回-1

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