資源描述:
《通過pipe進(jìn)程間通信》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、基于visualc++之windows核心編程代碼分析(17)通過pipe進(jìn)程間通信分類:VC++編程技術(shù)VisualC++2010編程技術(shù)VisualStudio2012Windows8信息安全2011-12-1712:17120人閱讀評(píng)論(0)收藏舉報(bào)管道是一種用于在進(jìn)程間共享數(shù)據(jù)的機(jī)制,其實(shí)質(zhì)是一段共享內(nèi)存。Windows系統(tǒng)為這段共享的內(nèi)存設(shè)計(jì)采用數(shù)據(jù)流I/0的方式來訪問。由一個(gè)進(jìn)程讀、另一個(gè)進(jìn)程寫,類似于一個(gè)管道兩端,因此這種進(jìn)程間的通信方式稱作“管道”。???管道分為匿名管道和命名管道。??
2、?匿名管道只能在父子進(jìn)程間進(jìn)行通信,不能在網(wǎng)絡(luò)間通信,而且數(shù)據(jù)傳輸是單向的,只能一端寫,另一端讀。???命令管道可以在任意進(jìn)程間通信,通信是雙向的,任意一端都可讀可寫,但是在同一時(shí)間只能有一端讀、一端寫。?管道客戶端代碼實(shí)現(xiàn)如下viewplaincopytoclipboardprint?1./*?頭文件?*/??2.#include????3.#include???4.#include???5.#include???6./*?常
3、量?*/??7.#define?BUFSIZE?512??8./*?************************************?9.*?int?main(VOID)??10.*?功能????pipe?通信服務(wù)端主函數(shù)?11.**************************************/??12.int?main(int?argc,?TCHAR?*argv[])???13.{???14.????HANDLE?hPipe;???15.????LPTSTR?lpvMessage=
4、TEXT("Default?message?from?client");???16.????TCHAR?chBuf[BUFSIZE];???17.????BOOL?fSuccess;???18.????DWORD?cbRead,?cbWritten,?dwMode;???19.????LPTSTR?lpszPipename?=?TEXT("\\.\pipe\samplenamedpipe");???1.??2.????if(?argc?>?1?)???//?如果輸入了參數(shù),則使用輸入的參數(shù)??3
5、.????????lpvMessage?=?argv[1];??4.????while?(1)???5.????{???6.????????//?打開一個(gè)命名pipe??7.????????hPipe?=?CreateFile(???8.????????????lpszPipename,???//?pipe?名???9.????????????GENERIC_READ?
6、???GENERIC_WRITE,?????//??可讀可寫??10.????????????0,??????????????//?不
7、共享??11.????????????NULL,???????????//?默認(rèn)安全屬性??12.????????????OPEN_EXISTING,??//?已經(jīng)存在(由服務(wù)端創(chuàng)建)??13.????????????0,??????????????//?默認(rèn)屬性??14.????????????NULL);??????15.????????if?(hPipe?!=?INVALID_HANDLE_VALUE)???16.????????????break;???17.??18.????????//?如果
8、不是?ERROR_PIPE_BUSY?錯(cuò)誤,直接退出????19.????????if?(GetLastError()?!=?ERROR_PIPE_BUSY)???20.????????{??21.????????????printf("Could?not?open?pipe");???22.????????????return?0;??23.????????}??24.??25.????????//?如果所有pipe實(shí)例都處于繁忙狀態(tài),等待2秒。??26.????????if?(!WaitNamedP
9、ipe(lpszPipename,?2000))???27.????????{???28.????????????printf("Could?not?open?pipe");???29.????????????return?0;??30.????????}???31.????}???32.??33.????//?pipe已經(jīng)連接,設(shè)置為消息讀狀態(tài)???34.????dwMode?=?PIPE_READMODE_MESSAGE;???35.?