在不同的程序之間傳播或交換資訊,讓不同的程序看到相同的檔案資源
匿名管道
#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...