青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

利用匿名管道在父子進程間傳遞數據

利用匿名管道在父子進程間傳遞數據

進程間傳遞數據有很多種方法,常用到的有命令行、共享內存、內存映射文件、剪貼板、windows消息、socket等。

命令行的缺點是數據長度限制。Windows2000只能傳遞256個字節,內存映射文件、共享內存都需要一些進程同步才能很好的配合讀寫數據,剪貼板可能會被其他進程擦數數據。當多開的時候很難控制進程間的對應關系。

一種解決方案是生成隨機命名的同步控制對象,然后利用命令行傳遞名字。同步控制對象可以通過唯一的名字再另一個進程中獲取其引用。

相對來說用同步對象會稍有些麻煩,匿名管道可以很好的解決這些問題。子進程可以繼承父進程中創建的句柄,父子進程一一對應的關系不會被打亂。而且使用簡單,父子進程可以雙向通信。

 

用法:

1.       首先創建兩條匿名管道,一條用于發送數據給子進程,一條用于從子進程接收數據,安全描述符中指定可繼承性 saAttr.bInheritHandle = TRUE;

2.       每條匿名管道包括兩個句柄,一個讀一個寫,可以理解為管道的兩端,從寫端寫出的數據可以從讀端讀取。所以父進程需要一條管道來接收數據,一條發送數據。

3.       windowsIO操作都可以用WriteFile ReadFile來完成,默認模式下數據發送和接收是阻塞的,管道的數據發送與接收也可以用重疊模式來進行。

4.       CreateProcess子進程時參數.bInheritHandle需要傳真,保證句柄的可繼承性。

5.       利用STARTUPINFO傳遞管道端口給子進程,父窗口發送數據的管道的讀端口,和父窗口等待接收數據的管道的寫端口,利用STDHANDLES來傳遞。

 

 STARTUPINFO  starinfo ={0};

    starinfo.cb 
= sizeof(starinfo);       

    starinfo.hStdInput 
= hSendReadPipe;

    starinfo.hStdOutput
= hRecvWritePipe;

    starinfo.hStdError 
= hRecvWritePipe;

    starinfo.dwFlags 
|= STARTF_USESTDHANDLES;

 

 

6.       子進程從STDHANDLES獲得兩個句柄用來讀寫。

 

HANDLE hRead  = GetStdHandle(STD_INPUT_HANDLE);   

HANDLE hWrite 
= GetStdHandle(STD_OUTPUT_HANDLE);

 

 

 

下面是完整代碼:

 

 



BOOL CreatePipe()

{

       SECURITY_ATTRIBUTES saAttr; 

       saAttr.nLength 
= sizeof(SECURITY_ATTRIBUTES); 

       saAttr.bInheritHandle 
= TRUE; 

       saAttr.lpSecurityDescriptor 
= NULL; 

       
/*'創建匿名管道*/

       
if (!CreatePipe(&hSendReadPipe,&hSendWritePipe, &saAttr, 0))

       
{

              ::LogMsg(
"CreatePipe failed!");

              
return FALSE;

       }


       
/*'構造寫句柄的復制體*/

       
if(!DuplicateHandle(GetCurrentProcess(), hSendWritePipe, 

              GetCurrentProcess(), 
&hSendWritePipeDup, 0,FALSE,DUPLICATE_SAME_ACCESS))

       
{

              ::LogMsg(
"DuplicateHandle Handle!");

              
return FALSE;

       }


       CloseHandle(hSendWritePipe);

 

       
//////////////////////////////////////////////////////////////////////////

       
if (!CreatePipe(&hRecvReadPipe,&hRecvWritePipe, &saAttr, 0))

       
{

              ::LogMsg(
"CreatePipe failed!");

              
return FALSE;

       }


       
/*'構造寫句柄的復制體*/

       
if(!DuplicateHandle(GetCurrentProcess(), hRecvReadPipe, 

              GetCurrentProcess(), 
&hRecvReadPipeDup, 0,FALSE,DUPLICATE_SAME_ACCESS))

       
{

              ::LogMsg(
"DuplicateHandle Handle!");

              
return FALSE;

       }


       CloseHandle(hRecvReadPipe);

       
return TRUE;

}


 

 

 

 

BOOL ReadFromPipe()

{

       DWORD dwReaded 
=0;

       
char szBuf[255];

       
return ReadFile(hRecvReadPipeDup, szBuf, sizeof(szBuf), &dwReaded, NULL);     ;

}


 

void WaitForReply()

{

       
while ( !ReadFromPipe()){}

}


 

BOOL WriteToPipe()

{

       
char szData[1024];

       
int nSize = sizeof(g_cmdData);

       CompressData((
char*)&g_cmdData,nSize,szData);

       

       
/*'對管道進行寫操作*/

       DWORD dwWrited 
=0;

       BOOL bSuccess 
= TRUE;

       bSuccess 
&= WriteFile(hSendWritePipeDup, (LPCVOID)szData, nSize, &dwWrited, NULL);

 

       CloseHandle(hSendWritePipeDup);      

       
if ( !bSuccess )

       
{

              ::LogMsg(
"WriteFile failed!");                           

              
return FALSE;

       }
     

       
return TRUE;

}


 

BOOL CreateGameProcess()

{

       
char strDir[MAX_PATH] ={0};

       
char strPath[MAX_PATH]={0};

 

       GetCurrentDirectory(MAX_PATH,strDir);

       strcpy(strPath,strDir);    

 

#ifdef _DEBUG

       const 
char* pszFileName = "\\main_debug.exe";

#
else

       const 
char* pszFileName = "\\main.exe";

#endif

       strcat(strPath,pszFileName);

 

       
if ( !CreatePipe() )

       
{     

              ::LogMsg(
"CreatePipe failed!");

              
return FALSE;

       }


 

       STARTUPINFO  starinfo 
={0};

       starinfo.cb 
= sizeof(starinfo);       

    starinfo.hStdInput 
= hSendReadPipe;

       starinfo.hStdOutput
= hRecvWritePipe;

       starinfo.hStdError 
= hRecvWritePipe;

    starinfo.dwFlags 
|= STARTF_USESTDHANDLES;

 

    PROCESS_INFORMATION processinfo 
={0};

       

       BOOL bRet 
=::CreateProcess(strPath, " fromlogin", NULL,NULL,TRUE,NULL,NULL,strDir,&starinfo,&processinfo);

       
if(bRet)

       
{

//            WaitForInputIdle(processinfo.hProcess,INFINITE);

              dwGameProcessID 
= processinfo.dwProcessId;

              CloseHandle(processinfo.hProcess);

              CloseHandle(processinfo.hThread);

              
return TRUE;

       }


       ::LogMsg(
"CreateProcess failed!");

 

       

       
return FALSE;

}


 

 

子進程中接收數據:

 



       DWORD dwReaded 
=0;                      

       HANDLE hRead  
= GetStdHandle(STD_INPUT_HANDLE); 

       HANDLE hWrite 
= GetStdHandle(STD_OUTPUT_HANDLE);

       

       
if( hRead )

       
{                   

              
/*'從管道接收數據*/

              const 
int  nBufSize = 2048;

              
char        szBuf[nBufSize];

              
if(ReadFile(hRead, &szBuf,nBufSize, &dwReaded, NULL))

              
{

}


}

posted on 2007-05-11 00:24 修一居士 閱讀(7813) 評論(4)  編輯 收藏 引用

評論

# re: 利用匿名管道在父子進程間傳遞數據[未登錄] 2007-05-11 11:11 夢在天涯

不錯,有機會也用一把
!  回復  更多評論   

# 很感興趣,但是有個地方沒有看懂,lz可以解釋一下么,謝謝了 2007-05-26 07:50 icewind

很感興趣,但是有個地方沒有看懂,lz可以解釋一下么,謝謝了
BOOL bRet =::CreateProcess(strPath, " fromlogin",
NULL,NULL,TRUE,NULL,NULL,strDir,&starinfo,&processinfo);

if(bRet)

{

// WaitForInputIdle(processinfo.hProcess,INFINITE);

/*不明白為什么要關閉句柄
dwGameProcessID = processinfo.dwProcessId;

CloseHandle(processinfo.hProcess);

CloseHandle(processinfo.hThread);
*/
return TRUE;

}
  回復  更多評論   

# re: 利用匿名管道在父子進程間傳遞數據 2007-05-31 14:04 南斗

windows 核心編程里有詳細的解釋,你創建得到的進(線)程句柄你關閉它是說你不想在使用這個句柄了,并不表示關閉就是摧毀,進(線)程句柄自己會維持一個引用計數,當它結束的時候引用計數會減一。  回復  更多評論   

# re: 利用匿名管道在父子進程間傳遞數據[未登錄] 2013-09-11 14:16 riverqh

看不懂為什么在CreatePipe之后要DuplicateHandle然后CloseHandle原來由CreatePipe創建的通道。  回復  更多評論   

導航

<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

統計

常用鏈接

留言簿(3)

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一二三四久久| 美女网站久久| 亚洲午夜激情在线| 欧美一区二区三区日韩| 一区二区高清视频在线观看| 亚洲韩国日本中文字幕| 美女亚洲精品| 欧美国产日产韩国视频| 亚洲激情婷婷| 亚洲摸下面视频| 欧美国产欧美综合 | 99精品久久| 欧美诱惑福利视频| 亚洲国产免费| 久久成人精品| 国产女精品视频网站免费| 尤物精品在线| 久久亚洲精品网站| 校园激情久久| 国产午夜精品久久久| 亚洲一区在线观看免费观看电影高清 | 老鸭窝91久久精品色噜噜导演| 欧美日韩精品一区二区天天拍小说| 国产乱码精品一区二区三区忘忧草 | 久久免费高清| 亚洲第一综合天堂另类专| 久久婷婷成人综合色| 亚洲欧美成人在线| 国产亚洲一级高清| 久久先锋资源| 欧美日韩在线亚洲一区蜜芽 | 久久婷婷久久| 亚洲图片在线| 欧美视频免费看| 亚洲欧美欧美一区二区三区| 在线一区二区三区做爰视频网站 | 亚洲一区二区三区在线视频| 欧美不卡视频一区发布| 久久久亚洲一区| 亚洲黄网站在线观看| 亚洲国产精品久久久久婷婷老年| 久久综合九色综合久99| 亚洲国产精品免费| 亚洲午夜国产成人av电影男同| 国产真实乱偷精品视频免| 性伦欧美刺激片在线观看| 欧美在线视频一区| 在线成人免费观看| 一区二区欧美激情| 亚洲电影第三页| 一区二区三区四区蜜桃| 精品成人一区二区三区| 日韩一区二区福利| 亚洲人成毛片在线播放女女| 午夜宅男久久久| 亚洲一区二区视频在线| 免费永久网站黄欧美| 老色鬼久久亚洲一区二区| 国产精品福利片| 一本色道久久综合狠狠躁篇的优点 | 欧美日韩一区在线观看视频| 久久理论片午夜琪琪电影网| 国产精品日韩精品| 国产在线精品一区二区中文| 日韩视频中午一区| 亚洲精品乱码视频| 欧美日本韩国| 亚洲九九精品| 亚洲欧美中文日韩在线| 欧美午夜不卡| 亚洲网址在线| 欧美一进一出视频| 国产精品三级视频| 欧美一级网站| 欧美成人首页| 在线视频精品一| 国产日本欧洲亚洲| 久久男人av资源网站| 免费视频久久| 一区二区精品在线| 国产精品扒开腿爽爽爽视频| 亚洲在线观看免费视频| 玖玖玖免费嫩草在线影院一区| 亚洲福利视频网站| 欧美午夜久久久| 久久久精品国产免费观看同学| 欧美gay视频激情| 午夜精品久久久久久久久久久久| 国产精品丝袜久久久久久app| 久久久久久有精品国产| 国产欧美一区二区精品秋霞影院| 久久婷婷人人澡人人喊人人爽| 一区二区免费看| 欧美激情精品久久久久久久变态| 午夜精品国产更新| 亚洲天堂av在线免费| 在线精品亚洲| 国产一区二区三区久久悠悠色av | 欧美大香线蕉线伊人久久国产精品| av成人手机在线| 国产午夜久久久久| 国产精品xxxxx| 欧美亚洲不卡| 欧美日韩一区三区| 欧美精品久久一区| 亚洲欧美久久久| 亚洲免费观看高清完整版在线观看| 国产精品视频网站| 欧美天堂亚洲电影院在线观看| 久久综合给合久久狠狠色| 亚洲图片欧洲图片av| 亚洲狠狠婷婷| 欧美激情精品| 日韩亚洲成人av在线| 亚洲免费电影在线观看| 99精品99| 久久夜色精品一区| 久久精品国产一区二区三区免费看| 日韩亚洲欧美在线观看| 日韩亚洲一区在线播放| 亚洲一区二区欧美日韩| 亚洲欧美日韩天堂| 久久精品色图| 亚洲国产专区| 午夜精品一区二区三区四区| 欧美在线视频导航| 欧美人与性动交a欧美精品| 欧美视频一区在线| 亚洲国产精品久久久久秋霞蜜臀| 最新国产精品拍自在线播放| 亚洲制服欧美中文字幕中文字幕| 久久精品视频在线| 亚洲精品一二| 久久久久久久一区二区| 欧美日韩影院| 亚洲精品影院| 欧美成人激情在线| 欧美综合国产精品久久丁香| 欧美日韩亚洲国产精品| 亚洲片在线观看| 久久在线视频在线| 亚洲一区黄色| 亚洲国产精品久久久久| 欧美在线啊v一区| 国产欧美日韩另类一区| 午夜一区二区三区不卡视频| 999在线观看精品免费不卡网站| 免费高清在线视频一区·| 韩国成人福利片在线播放| 欧美在线黄色| 久久免费高清| 一区二区三区欧美成人| 夜夜夜久久久| 国产中文一区| 欧美搞黄网站| 欧美午夜片在线免费观看| 亚洲欧美日韩精品久久久久| 亚洲在线成人| 亚洲欧洲日产国产综合网| 亚洲精品国产精品国自产在线| 欧美日韩91| 久久精品国产久精国产一老狼| 久久手机免费观看| 亚洲午夜视频在线观看| 欧美一区二区三区免费在线看| 亚洲片国产一区一级在线观看| 99精品欧美一区二区三区 | 亚洲三级视频在线观看| 欧美三区在线视频| 欧美成人精品高清在线播放| 欧美日韩国产123区| 久久精品国产综合| 欧美日韩一区二区免费视频| 欧美中文字幕| 国产精品久久久久久久久果冻传媒| 欧美在线短视频| 欧美日韩精品免费在线观看视频| 欧美一区免费视频| 国产精品护士白丝一区av| 欧美国产精品日韩| 91久久精品国产91久久性色| 久久国产精品高清| 久久久久久久久岛国免费| 国产美女一区二区| 午夜精品999| 午夜免费在线观看精品视频| 亚洲人成在线播放| 91久久精品一区二区三区| 麻豆精品网站| 亚洲伦理在线观看| 蜜臀av性久久久久蜜臀aⅴ| 中文日韩欧美| 久久久一区二区| 91久久线看在观草草青青| 欧美日韩大陆在线| 亚洲欧美国产77777| 欧美高清视频一区二区三区在线观看| 91久久精品一区二区别| 国产欧美日韩在线| 欧美高清在线一区二区|