資源簡(jiǎn)介
C++匿名管道詳解及簡(jiǎn)單案例(基于VS2013),包括父進(jìn)程和子進(jìn)程的創(chuàng)建以及各行代碼的詳細(xì)注釋
代碼片段和文件信息
#include?“stdafx.h“
#include?“windows.h“
#include?
using?namespace?std;
HANDLE?hRead?hWrite;
void?ReadMsg()
{
char?buf1[512];
DWORD?dwRead;
if?(!ReadFile(hRead?buf1?512?&dwRead?NULL))
{
cout<<“讀取數(shù)據(jù)失敗!“;
return;
}
else
{
cout?<“管道中讀取數(shù)據(jù)為:“< system(“pause“);
}
}
void?WriteMsg()
{
char?buf[100];
cout?<“請(qǐng)輸入你要發(fā)給子進(jìn)程的消息:\n“;
cin?>>?buf;
DWORD?dwWrite;
if?(!WriteFile(hWrite?buf?strlen(buf)?&dwWrite?NULL))
{
cout?<“寫入數(shù)據(jù)失敗!“;
return;
}
else
cout?<“成功寫入數(shù)據(jù)!\n“;
}
int?main(int?argc?char*?argv[])
{
SECURITY_ATTRIBUTES?sa;??//定義一個(gè)安全結(jié)構(gòu)體類型的變量Sa1
sa.bInheritHandle?=?TRUE;//讓子進(jìn)程可以繼承父進(jìn)程創(chuàng)建的匿名管道的讀寫句柄
sa.lpSecurityDescriptor?=?NULL;//讓系統(tǒng)為創(chuàng)建的匿名管道賦予默認(rèn)的安全描述符
sa.nLength?=?sizeof(SECURITY_ATTRIBUTES);//得到結(jié)構(gòu)體(SECURITY_ATTRIBUTES)的長(zhǎng)度
if?(!CreatePipe(&hRead?&hWrite?&sa?0))//判斷創(chuàng)建匿名管道是否成功
{
cout?<“創(chuàng)建匿名管道失敗!\n“;
return?0;
}
else
cout?<“成功創(chuàng)建匿名管道!\n“;
//如果創(chuàng)建匿名管道成功,就啟動(dòng)子進(jìn)程,并將匿名管道的讀寫句柄傳遞給子進(jìn)程
STARTUPINFO?sui;//創(chuàng)建子進(jìn)程的函數(shù)需要的一個(gè)結(jié)構(gòu)體類型的值
PROCESS_INFORMATION?pi;
ZeroMemory(&sui?sizeof(STARTUPINFO));//將其余的成員全部置零,避免造成不好的影響
sui.cb?=?sizeof(STARTUPINFO);//cb用來存放結(jié)構(gòu)體變量STARTUPINFO的長(zhǎng)度
sui.dwFlags?=?STARTF_USESTDHANDLES;//標(biāo)志成員,表示當(dāng)前STARTUPINFO結(jié)構(gòu)體的標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤句柄有用
sui.hStdInput?=?hRead;
sui.hStdOutput?=?hWrite;//將子進(jìn)程的標(biāo)準(zhǔn)輸入輸出句柄分別設(shè)置為管道的讀、寫句柄
sui.hStdError?=?GetStdHandle(STD_ERROR_HANDLE);
sui.wShowWindow?=?SW_SHOW;?//隱藏命令行窗口
sui.dwFlags?=?STARTF_USESHOWWINDOW?|?STARTF_USESTDHANDLES;
WriteMsg();
if?(!CreateProcess(NULL?“child.exe“?NULL?NULL
TRUE?0?NULL?NULL?&sui?&pi))//創(chuàng)建子進(jìn)程(十個(gè)參數(shù))
{
CloseHandle(hRead);
CloseHandle(hWrite);//關(guān)閉句柄,將內(nèi)核對(duì)象的使用計(jì)數(shù)減少1,這樣當(dāng)操作系統(tǒng)發(fā)現(xiàn)內(nèi)核對(duì)象的使用計(jì)數(shù)為0時(shí),將清除內(nèi)核對(duì)象。
hRead?=?NULL;
hWrite?=?NULL;
cout?<“創(chuàng)建子進(jìn)程失敗!“;
return?0;
}
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
Sleep(200);
ReadMsg();
return?0;
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-03-09?09:04??匿名管道程序\
?????目錄???????????0??2018-03-09?09:02??匿名管道程序\Anonymous?Pipe\
?????目錄???????????0??2018-03-09?09:02??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\
?????文件????????2274??2018-03-09?08:49??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Anonymous?Pipe.cpp
?????文件????????4548??2018-03-09?08:32??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Anonymous?Pipe.vcxproj
?????文件????????1321??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Anonymous?Pipe.vcxproj.filters
?????目錄???????????0??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\
?????文件?????????155??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.log
?????文件??????206943??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.obj
?????文件?????1703936??2018-03-09?08:32??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.pch
?????目錄???????????0??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\
?????文件?????????209??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\Anonymous?Pipe.lastbuildstate
?????文件???????30938??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\CL.read.1.tlog
?????文件????????1984??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\CL.write.1.tlog
?????文件????????1838??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\cl.command.1.tlog
?????文件????????1814??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\li
?????文件????????3544??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\li
?????文件????????1066??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\Anonymous?Pipe.tlog\li
?????文件???????11813??2018-03-09?08:32??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\stdafx.obj
?????文件??????764928??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\vc120.idb
?????文件??????487424??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\Debug\vc120.pdb
?????文件????????1559??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\ReadMe.txt
?????文件???????66560??2018-03-09?09:02??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\child.exe
?????文件?????????220??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\stdafx.cpp
?????文件?????????234??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\stdafx.h
?????文件?????????236??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe\targetver.h
?????文件????32702464??2018-03-09?09:02??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe.sdf
?????文件?????????988??2018-03-09?08:31??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe.sln
?????文件???????19968??2018-03-09?09:02??匿名管道程序\Anonymous?Pipe\Anonymous?Pipe.v12.suo
?????目錄???????????0??2018-03-09?08:36??匿名管道程序\Anonymous?Pipe\Debug\
?????文件???????74752??2018-03-09?08:55??匿名管道程序\Anonymous?Pipe\Debug\Anonymous?Pipe.exe
............此處省略38個(gè)文件信息
評(píng)論
共有 條評(píng)論