程序間通訊

2021-10-25 00:09:48 字數 1854 閱讀 8421

管道(使用最簡單)

原理管道實為核心使用環形佇列機制,借助核心緩衝區實現

侷限性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...