IPC之命名管道

2022-07-23 08:27:09 字數 2503 閱讀 5079

1.管道是通過io介面訪問得位元組流, windows中利用得是readfile()和writefile(),windows利用單一控制代碼支援雙向io,命名管道也稱做fifo(first in first out)

命名管道得機制:乙個程序把資料放到管道裡,另乙個知道管道名字得程序把資料把取走,實際是用於程序間通訊得一段共享記憶體,建立管道得程序稱為管道伺服器,鏈結到乙個管道得程序為管道客戶機,用以下函式 

2.命名管道服務端與客戶端之間通訊的實現流程:

-- -4.2.2

命名管道服務端與客戶端之間通訊的實現流程一

(1) 連線建立

使用訊息管道、郵槽和套接字通訊

服務端通過函式createnamedpipe()建立- 乙個命名管道的例項並返回用於今後操作

的控制代碼,或為已存在的管道建立新的例項。如果在已定義超時值變為0 以前,有一乙個實

例管道可以使用,則建立成功並返回管道控制代碼,並用以偵聽來自客戶端的連線請求,該

功能通過conneclnamedpipe(實現。

另- 一方面,客戶端通過函式waitinamedpipe()使服務程序等待來自客戶的例項連線。

如果在超時值變為0以前,有一乙個管道可以為連線使用,則waitnamedpipe()返回true,

並通過呼叫createfile()或callinamedpipe()來呼叫對服務端的連線。此時服務端將接受客

戶端的連線請求,成功建立連線,服務端connectnamedpipe(返回true,客戶端

creatcfile()返回- 乙個指向管道檔案的控制代碼。

從時序上講,首先是客戶端通過waitnamedpipe()使服務端的createfile()在限定時間

內建立例項成功,然後雙方通過connectnamedpipe()和createfile()成功連線,並返回用

於通訊的檔案控制代碼,此時雙方即可進行通訊。

(2) 通訊實現

建立連線之後,客戶和服務端可以通過得到的管道檔案控制代碼利用readfile()和

writefile()進行彼此間的資訊交換。

(3) 連線終止

當客戶端與服務端的通訊結束,或由於某種原因一一方需要斷開時,客戶端應呼叫

closefile(),而服務端應接著呼叫disconnectnamedpipe。當然服務端亦可通過單方面

呼叫disconnectnamedpipe()終止連線。最後應呼叫closehandle()來關閉該管道。

server端 (1.啟動服務 建立管道和事件2.建立執行緒負責與客戶端通訊(利用io重疊與建立的事件聯絡)。3.接收客戶端資料做出計算再反饋到客戶端)

一 啟動服務startserver

1.建立管道的名字 cstring pipefullpathdata = l"\\\\.\\pipe\\namedpipepipe";

2.建立管道 分配事件(因為是namepipe),通過執行緒來通訊

3.**

void cserverdlg::onbnclickedbuttonstartserver()}}

事件執行緒函式(利用的是io重疊)注意的是bufferdata的傳入 兩個或多個資料的傳入這樣做

return 0;

}關閉服務

void cserverdlg::onbnclickedbuttonstopserver()

this->setwindowtext(l"命名管道—伺服器(停止)");

this->messagebox(l"停止啟動成功");

}client端(提交資料到主控端,主控端反饋最終結果到客戶端)

void cclientdlg::onbnclickedbuttonsubmitclient()

dword returnlength = 0;

char bufferdata[0x400] = ;

// 把兩個整數(a,b)格式化為字串

m_v1 = getdlgitemint(idc_edit_v1);

m_v2 = getdlgitemint(idc_edit_v2);

sprintf(bufferdata, "%d %d", this->m_v1, this->m_v2);//v1,v2寫入陣列

// 把資料寫入管道

writefile(namedpipehandle, bufferdata, strlen(bufferdata), &returnlength/*寫入地*/, null);

memset(bufferdata, 0,0x400);//清空

// 伺服器反饋後,讀取伺服器的反饋資訊

readfile(namedpipehandle, bufferdata, 0x400, &returnlength, null);

sscanf(bufferdata, "%d", &(this->m_v3));//client寫入 server輸出

/*因為是客戶端做運算,然後主控端響應再反饋*/

setdlgitemint(idc_edit_v3, m_v3, true);

closehandle(namedpipehandle);

}

ipc通訊之管道

首先 一 無名管道pipe 1,沒有名字的 2,半雙工 讀寫不能同時進行 3,通過直系親屬訪問繼承 4,管道缺省會阻塞 5,不能用lseek定位 6,操作沒有原子性 示例 include include include include include include include void sig...

IPC實現機制(二) 命名管道(FIFO)

一 fifo的概念 匿名管道 pipe 的 個不 之處是沒有名字,因此,只能 於具有親緣關係的程序間通訊 因此,提出了命名管道 命名管道 fifo 提供 個路徑名與之關聯,以fifo的 件形式儲存於 件系統中。命名管道是 個裝置 件,因此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路...

Linux下的IPC 命名管道的使用

程序之間通過管道來進行通訊是一種常用的方法,顧名思義,管道就是一端進 寫 一端出 讀 的fifo佇列,這個佇列由核心管理,有一定大小 一般是4k 有文章上提到,如果需要修改該快取區,需要重新編譯核心 修改linux limits.h裡pipe buf的定義 需要明確的是,雖然管道在理論上是雙向的,但...