管道(使用最簡單)
原理管道實為核心使用環形佇列機制,借助核心緩衝區實現
侷限性1.資料不能自己讀寫
2.資料一旦被讀走,便不在管道中存在,不可反覆讀取
3.管道採用半雙工的工作方式,資料只可以在乙個方向上流動
4.只能在有公共祖先的程序間使用管道
linux下的七種檔案
s 套接字
b 塊裝置
c 字元裝置
p 管道
pipe
管道一般讀寫行為
fifo(有名管道i):用於非血緣關係程序間通訊
共享記憶體
mmap
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
成功:返回對映區位址
失敗:返回map_failed 巨集
addr---建立對映區的首位址,由linux核心指定,使用時,直接傳遞null
length---欲建立對映區的大小
prot---對映區許可權
prot_readprot_writeprot_read|port_write
flags---標誌位引數,
map_shared:會將對映區所做的操作反映到物理磁碟上
map_private:對映區所作的修改不會反映到物理裝置
fd---用來建立對映區的檔案描述符
offset---對映檔案的偏移 **offset 必須是4k的整數倍**
匿名對映
使用對映區來完成檔案讀寫的缺陷是:每次建立對映區一定要依賴乙個檔案才能實現,通常為了使用乙個對映區,需要建立乙個檔案,然後再unlink該檔案,最後close掉,十分麻煩。為了方便,我們可以使用匿名對映來代替,無需依賴乙個檔案即可建立對映區。
函式的引數使用注意事項。
用於非血緣關係程序間通訊
訊號(開銷最小)
訊號的概念
1.簡單
2.不能攜帶大量資訊
3.滿足某個特定條件才傳送
注意:每個程序收到的所有訊號,都是由核心傳送,核心處理
基本的屬性
訊號4要素
1.編號
2.名稱
3.事件
4.預設處理動作
raise函式
給當前程序傳送指定訊號(自己給自己發)
raise(signo) == kill(getpid(),signo)
int raise(int sig);成功:0 失敗:非0值
abort函式
給自己傳送異常終止訊號
sigabrt訊號,終止並產生core檔案
void abort();該函式無返回
kill
alarm函式
setitimer
signal
訊號集操作函式
訊號遮蔽字(阻塞訊號集 set)
未決訊號集(set)
訊號的捕捉— 類似於qt的訊號和槽函式
註冊訊號捕捉函式
sigaction();
共享對映區(無血緣關係)
本地套接字(最穩定)
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...