欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
利用匿名管道在父子進(jìn)程間傳遞數據 - 游戲人生 - C 博客

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

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

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

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

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

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

 

用法:

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

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

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

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

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

 

 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è)句柄用來(lái)讀寫(xiě)。

 

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;

       }


       
/*'構造寫(xiě)句柄的復制體*/

       
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;

       }


       
/*'構造寫(xiě)句柄的復制體*/

       
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)行寫(xiě)操作*/

       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)程中接收數據:

 



       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 南斗 閱讀(2136) 評論(3)  編輯 收藏 引用

# 

評論

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

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

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

很感興趣,但是有個(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;

}
  回復  更多評論  

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

windows 核心編程里有詳細的解釋?zhuān)銊?chuàng )建得到的進(jìn)(線(xiàn))程句柄你關(guān)閉它是說(shuō)你不想在使用這個(gè)句柄了,并不表示關(guān)閉就是摧毀,進(jìn)(線(xiàn))程句柄自己會(huì )維持一個(gè)引用計數,當它結束的時(shí)候引用計數會(huì )減一。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Windows系統編程之進(jìn)程間通信_mypage
孫鑫VC視頻教程筆記之第十七課“進(jìn)程間的通信”
進(jìn)程間通信---1.匿名管道
gh0st源碼分析與遠控的編寫(xiě)(三)
windows下進(jìn)程間的通信介紹
淺談 windows 命名管道
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久