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

利用匿名管道在父子進(jìn)程間傳遞數(shù)據(jù)

利用匿名管道在父子進(jìn)程間傳遞數(shù)據(jù)

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

命令行的缺點(diǎn)是數(shù)據(jù)長度限制。Windows2000只能傳遞256個(gè)字節(jié),內(nèi)存映射文件、共享內(nèi)存都需要一些進(jìn)程同步才能很好的配合讀寫數(shù)據(jù),剪貼板可能會(huì)被其他進(jìn)程擦數(shù)數(shù)據(jù)。當(dāng)多開的時(shí)候很難控制進(jìn)程間的對應(yīng)關(guān)系。

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

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

 

用法:

1.       首先創(chuàng)建兩條匿名管道,一條用于發(fā)送數(shù)據(jù)給子進(jìn)程,一條用于從子進(jìn)程接收數(shù)據(jù),安全描述符中指定可繼承性 saAttr.bInheritHandle = TRUE;

2.       每條匿名管道包括兩個(gè)句柄,一個(gè)讀一個(gè)寫,可以理解為管道的兩端,從寫端寫出的數(shù)據(jù)可以從讀端讀取。所以父進(jìn)程需要一條管道來接收數(shù)據(jù),一條發(fā)送數(shù)據(jù)。

3.       windowsIO操作都可以用WriteFile ReadFile來完成,默認(rèn)模式下數(shù)據(jù)發(fā)送和接收是阻塞的,管道的數(shù)據(jù)發(fā)送與接收也可以用重疊模式來進(jìn)行。

4.       CreateProcess子進(jìn)程時(shí)參數(shù).bInheritHandle需要傳真,保證句柄的可繼承性。

5.       利用STARTUPINFO傳遞管道端口給子進(jìn)程,父窗口發(fā)送數(shù)據(jù)的管道的讀端口,和父窗口等待接收數(shù)據(jù)的管道的寫端口,利用STDHANDLES來傳遞。

 

 STARTUPINFO  starinfo ={0};

    starinfo.cb 
= sizeof(starinfo);       

    starinfo.hStdInput 
= hSendReadPipe;

    starinfo.hStdOutput
= hRecvWritePipe;

    starinfo.hStdError 
= hRecvWritePipe;

    starinfo.dwFlags 
|= STARTF_USESTDHANDLES;

 

 

6.       子進(jìn)程從STDHANDLES獲得兩個(gè)句柄用來讀寫。

 

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; 

       
/*'創(chuàng)建匿名管道*/

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

       
{

              ::LogMsg(
"CreatePipe failed!");

              
return FALSE;

       }


       
/*'構(gòu)造寫句柄的復(fù)制體*/

       
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;

       }


       
/*'構(gòu)造寫句柄的復(fù)制體*/

       
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);

       

       
/*'對管道進(jìn)行寫操作*/

       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;

}


 

 

子進(jìn)程中接收數(shù)據(jù):

 



       DWORD dwReaded 
=0;                      

       HANDLE hRead  
= GetStdHandle(STD_INPUT_HANDLE); 

       HANDLE hWrite 
= GetStdHandle(STD_OUTPUT_HANDLE);

       

       
if( hRead )

       
{                   

              
/*'從管道接收數(shù)據(jù)*/

              const 
int  nBufSize = 2048;

              
char        szBuf[nBufSize];

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

              
{

}


}

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

評論

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

不錯(cuò),有機(jī)會(huì)也用一把
!  回復(fù)  更多評論   

# 很感興趣,但是有個(gè)地方?jīng)]有看懂,lz可以解釋一下么,謝謝了 2007-05-26 07:50 icewind

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

if(bRet)

{

// WaitForInputIdle(processinfo.hProcess,INFINITE);

/*不明白為什么要關(guān)閉句柄
dwGameProcessID = processinfo.dwProcessId;

CloseHandle(processinfo.hProcess);

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

}
  回復(fù)  更多評論   

# re: 利用匿名管道在父子進(jìn)程間傳遞數(shù)據(jù) 2007-05-31 14:04 南斗

windows 核心編程里有詳細(xì)的解釋,你創(chuàng)建得到的進(jìn)(線)程句柄你關(guān)閉它是說你不想在使用這個(gè)句柄了,并不表示關(guān)閉就是摧毀,進(jìn)(線)程句柄自己會(huì)維持一個(gè)引用計(jì)數(shù),當(dāng)它結(jié)束的時(shí)候引用計(jì)數(shù)會(huì)減一。  回復(fù)  更多評論   

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿(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>
            久久成年人视频| 99re6热只有精品免费观看| 久久久久久久久久久久久女国产乱 | 久久aⅴ国产欧美74aaa| 午夜精品福利视频| 久久久久久伊人| 欧美大香线蕉线伊人久久国产精品| 久久精品亚洲一区| 欧美精品免费在线观看| 国产精品亚洲视频| 国内自拍亚洲| 亚洲视频你懂的| 久久国产主播精品| 欧美激情久久久| 在线视频日韩| 久久久久久久综合狠狠综合| 欧美精品首页| 国产婷婷精品| 亚洲精品美女免费| aⅴ色国产欧美| 亚洲欧美另类国产| 免费欧美在线| 久久精品女人的天堂av| 欧美高清在线一区| 亚洲一区二区三区精品在线| 久久精品91| 欧美日韩一区二区在线观看| 国精品一区二区三区| 日韩小视频在线观看| 久久国产精品99久久久久久老狼 | 欧美亚洲第一页| 国产日韩欧美成人| 亚洲美女精品一区| 久久久久久亚洲综合影院红桃| 亚洲高清资源| 亚洲免费精彩视频| 久久精品视频99| 一区二区三区精品视频在线观看| 久久国产日韩欧美| 欧美另类99xxxxx| 狠狠色伊人亚洲综合网站色| 99热这里只有精品8| 卡通动漫国产精品| 亚洲男女毛片无遮挡| 欧美三级第一页| 亚洲精品午夜精品| 亚洲第一主播视频| 久久精品亚洲一区二区三区浴池 | 亚洲国产成人久久综合| 亚洲欧美成人一区二区在线电影| 欧美成人黑人xx视频免费观看| 一区二区三区三区在线| 欧美激情精品久久久久久变态| 好看的亚洲午夜视频在线| 久久爱另类一区二区小说| 亚洲免费成人| 欧美性淫爽ww久久久久无| 99av国产精品欲麻豆| 亚洲另类在线一区| 一区二区三区四区五区精品| 亚洲国产成人av在线| 久久久av毛片精品| 国模私拍视频一区| 免费观看日韩| 欧美jizzhd精品欧美喷水| 精品88久久久久88久久久| 久久成人精品电影| 久久精品动漫| 国产亚洲观看| 免费在线播放第一区高清av| 欧美中文字幕在线| 亚洲二区免费| 国产网站欧美日韩免费精品在线观看| 午夜精品视频在线观看| 午夜精品偷拍| 亚洲成色777777女色窝| 免费亚洲婷婷| 欧美日韩国产综合一区二区 | 久久国产加勒比精品无码| 亚洲欧美日韩国产| 狠狠色丁香婷婷综合久久片| 免费成人黄色片| 美女诱惑黄网站一区| 亚洲国产精品欧美一二99| 亚洲国产一区二区三区在线播| 欧美1区2区| 一区二区三区四区五区精品| 亚洲视频欧洲视频| 国内偷自视频区视频综合| 久久永久免费| 蜜臀99久久精品久久久久久软件| 亚洲国产视频a| 亚洲国产精品毛片| 国产网站欧美日韩免费精品在线观看 | 国产日韩欧美三区| 免费久久99精品国产| 你懂的国产精品| 亚洲欧美一区二区原创| 米奇777在线欧美播放| 亚洲一区二区三区四区中文 | 99视频在线观看一区三区| 亚洲一区二区三区精品视频| 精品成人一区二区三区四区| 艳女tv在线观看国产一区| 国产一区观看| 中文在线不卡视频| 亚洲高清中文字幕| 国产精品99久久久久久有的能看| 国产丝袜美腿一区二区三区| 亚洲大片av| 国产麻豆日韩| 一区二区三区 在线观看视频| 国产专区一区| 亚洲日本欧美在线| 极品av少妇一区二区| 校园激情久久| 亚洲综合社区| 欧美三级在线| 欧美激情久久久| 国产视频综合在线| 一区二区三区四区五区在线| 日韩视频一区二区在线观看 | 欧美福利精品| 欧美成人一品| 亚洲成人在线| 久久久五月天| 久久综合99re88久久爱| 国产女主播一区二区三区| 一本久道久久综合狠狠爱| 亚洲精品乱码久久久久久| 久久野战av| 免费人成精品欧美精品| 伊伊综合在线| 看欧美日韩国产| 欧美国产精品专区| 亚洲欧洲一区二区三区| 男男成人高潮片免费网站| 亚洲第一在线视频| 亚洲狼人综合| 欧美日韩精品一区二区天天拍小说 | 亚洲网站视频| 欧美色图五月天| 亚洲特级片在线| 欧美一二区视频| 国产亚洲制服色| 久久久久久亚洲精品中文字幕| 久久女同精品一区二区| 国产精品永久免费在线| 亚洲手机视频| 久久久亚洲精品一区二区三区| 精品1区2区3区4区| 欧美国产日韩视频| 一区二区三区四区五区精品视频 | 久久国产免费看| 黄网动漫久久久| 欧美国产日韩在线| 99riav国产精品| 久久精品理论片| 亚洲国产三级在线| 国产精品videossex久久发布| 亚洲男同1069视频| 免费久久99精品国产自在现线| 91久久在线视频| 国产精品理论片| 巨乳诱惑日韩免费av| 在线天堂一区av电影| 久久一本综合频道| av成人老司机| 国内精品国语自产拍在线观看| 欧美黄网免费在线观看| 中文国产一区| 欧美国产日韩一区二区三区| 亚洲一区二区在| 亚洲第一区在线观看| 国产精品久久国产精品99gif| 久久精品夜色噜噜亚洲aⅴ| 亚洲免费播放| 欧美成人亚洲成人| 欧美影片第一页| 一本色道久久加勒比精品 | 国产精品稀缺呦系列在线| 久久久久久久一区二区| 亚洲视频www| 亚洲电影免费在线观看| 欧美在线短视频| 亚洲视频在线观看视频| 亚洲激情电影在线| 黑人巨大精品欧美一区二区小视频| 欧美三级网址| 欧美久久久久久久| 久久免费国产| 欧美一区亚洲| 亚洲欧美另类中文字幕| 日韩视频三区| 亚洲国产精品一区制服丝袜 | 国产精品网站在线观看| 欧美日韩免费一区| 欧美va亚洲va日韩∨a综合色| 欧美一区二区三区在线看| 亚洲一区二区三区成人在线视频精品|