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

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

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

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

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

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

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

 

用法:

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

2.       每條匿名管道包括兩個句柄,一個讀一個寫,可以理解為管道的兩端,從寫端寫出的數(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ù).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獲得兩個句柄用來讀寫。

 

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 夢在天涯

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

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

很感興趣,但是有個地方?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)閉它是說你不想在使用這個句柄了,并不表示關(guān)閉就是摧毀,進(jìn)(線)程句柄自己會維持一個引用計(jì)數(shù),當(dāng)它結(jié)束的時候引用計(jì)數(shù)會減一。  回復(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)航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

統(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>
            日韩一区二区精品葵司在线| 久久免费视频观看| 欧美一区二区三区视频在线观看 | 欧美日韩视频专区在线播放 | 国产亚洲人成a一在线v站| 国产精品免费在线| 国产精品伦一区| 国产一区二区三区四区五区美女| 韩曰欧美视频免费观看| 亚洲国产成人精品久久| 亚洲免费观看高清在线观看| 一区二区三区国产盗摄| 欧美一区二区三区婷婷月色 | 亚洲一区免费看| 午夜精品久久久99热福利| 久久国产一区| 欧美激情第一页xxx| 艳妇臀荡乳欲伦亚洲一区| 午夜日韩在线| 毛片一区二区三区| 国产精品99免视看9| 国产一区自拍视频| 日韩视频在线观看国产| 性久久久久久久| 欧美二区在线观看| 亚洲一区二区三区久久| 噜噜噜在线观看免费视频日韩 | 久久国产日本精品| 欧美~级网站不卡| 国产精品久久国产精品99gif | 免费欧美电影| 在线视频欧美日韩精品| 久久精品中文字幕一区| 欧美视频中文一区二区三区在线观看| 国产一区二区欧美| 亚洲精品小视频| 欧美在线影院| 亚洲人成亚洲人成在线观看图片| 亚洲一级黄色av| 蜜桃av一区二区三区| 亚洲精品视频中文字幕| 欧美日韩www| 国产午夜精品久久久久久免费视 | 欧美国产日韩在线| 亚洲午夜av电影| 久久香蕉国产线看观看网| 亚洲自拍另类| 欧美激情视频给我| 欧美一区二区在线| 欧美日韩在线三区| 亚洲激情一区| 久久综合伊人| 亚洲欧美在线磁力| 国产精品推荐精品| 亚洲视频日本| 亚洲毛片av在线| 欧美激情偷拍| 91久久亚洲| 欧美成人精品在线视频| 麻豆久久精品| 欧美在线一二三| 国产婷婷精品| 久久久福利视频| 欧美专区在线观看| 黄色成人av| 99国产精品视频免费观看一公开| 美日韩精品免费观看视频| 欧美一级在线播放| 国产一区视频网站| 久久久999精品视频| 欧美诱惑福利视频| 国产在线播放一区二区三区| 欧美影院视频| 欧美一区二区日韩一区二区| 国产日韩在线不卡| 久久久五月婷婷| 久久久久久久999| 亚洲国产精品va| 欧美激情在线狂野欧美精品| 欧美成年人视频| 国产日韩高清一区二区三区在线| 亚洲欧美日韩精品久久奇米色影视 | 欧美91福利在线观看| 久久久久久国产精品mv| 在线观看一区| 欧美激情女人20p| 欧美另类久久久品| 中文一区二区| 午夜精品av| 伊人成人开心激情综合网| 亚洲精选在线观看| 99精品视频免费观看视频| 久久久av毛片精品| 日韩一区二区免费高清| 亚洲一区在线观看免费观看电影高清| 狠狠色狠狠色综合人人| 猫咪成人在线观看| 蜜桃av综合| 一区二区三区 在线观看视频| 一区二区91| 国产亚洲精品久| 亚洲国产成人在线| 国产精品久线观看视频| 久久躁日日躁aaaaxxxx| 欧美激情综合在线| 午夜视频一区二区| 美女诱惑一区| 欧美一区二区三区在线| 久久久免费av| 亚洲图片你懂的| 久久久久国产精品www| 亚洲伦伦在线| 亚洲欧美视频在线观看| 亚洲啪啪91| 欧美一区二区三区婷婷月色| 日韩视频亚洲视频| 欧美影院视频| 亚洲制服av| 欧美—级在线免费片| 亚洲日本国产| 久久精品人人| 欧美一区二区视频观看视频| 久久先锋影音| 欧美综合二区| 欧美午夜无遮挡| 亚洲国产女人aaa毛片在线| 国产日本欧美视频| 日韩五码在线| 99ri日韩精品视频| 欧美黄色视屏| 在线播放亚洲| 久久精品二区三区| 先锋亚洲精品| 国产精品黄视频| 亚洲免费av网站| 亚洲精品国偷自产在线99热| 久久精品一二三| 久久精品国产清自在天天线| 国产精品a久久久久| 亚洲美女黄色片| 日韩午夜视频在线观看| 欧美成在线视频| 欧美电影在线免费观看网站| 国模叶桐国产精品一区| 亚洲一区二区三区四区在线观看 | 亚洲一二三四区| 欧美日韩国产999| 亚洲青色在线| 一区二区三区免费在线观看| 欧美精品1区2区| 亚洲黄色小视频| 99精品国产一区二区青青牛奶 | 亚洲图色在线| 99天天综合性| 欧美久久婷婷综合色| 99精品视频网| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品美女www爽爽爽视频| 久久精品中文字幕免费mv| 欧美xxx在线观看| 亚洲欧洲日韩在线| 亚洲精选在线| 亚洲一区三区视频在线观看| 亚洲免费综合| 亚洲国产老妈| 久久久久se| 一区二区三区波多野结衣在线观看| 狂野欧美一区| 久久婷婷久久一区二区三区| 在线亚洲伦理| 亚洲视频在线免费观看| 亚洲国产女人aaa毛片在线| 亚洲国产日韩一区| 99国产精品| 篠田优中文在线播放第一区| 在线观看成人小视频| 午夜久久tv| 麻豆九一精品爱看视频在线观看免费| 亚洲欧美日韩精品综合在线观看| 欧美电影免费观看高清完整版| 免费在线观看成人av| 麻豆成人在线观看| 一区二区免费在线播放| 亚洲欧美日韩一区二区在线| 亚洲在线黄色| 亚洲欧美日韩在线高清直播| 久久久久综合一区二区三区| 久久人91精品久久久久久不卡| 欧美一区二区女人| 免费日韩av片| 久久久亚洲影院你懂的| 久久精品人人做人人爽电影蜜月| 国产精品电影在线观看| 国产视频不卡| 午夜在线成人av| 亚洲午夜成aⅴ人片| 国产在线观看精品一区二区三区| 亚洲第一视频网站| 一本久久a久久精品亚洲| 亚洲视频综合在线|