前面的共享内存(C/C++ 日常学习总结(第二十二篇)共享内存实现C++ )也是进程间的,但不限于父子进程,今天看到一个使用环境变量的,范围只能在父子进程里使用,也正好学习下。
1.描述
父进程向其环境块添加一个环境变量。变量的名称应该是子进程知道的一个名称,不知道时可参考(附:工作问题总结(三十)共享内存续(当文件映射对象的名称未知时) ),而变量的值应该是准备被子进程继承的那个内核对象的句柄值,然后当父进程生成子进程的时候,这个子进程会继承父进程的环境变量,所以能轻松调用GetEnvironmentVariable来获得这个继承到的内核对象的句柄值。如果子进程还要生成另一个子进程,这种方式就应该非常不错,因为环境变量是可以反复继承的。
2.代码
parent:
LPCTSTR lpName("server001");
LPCTSTR lpValue("95588");
::SetEnvironmentVariable(lpName,lpValue);
STARTUPINFO m_ClientSI;
PROCESS_INFORMATION m_ClientPI;
ZeroMemory( &m_ClientPI, sizeof(m_ClientPI) );
ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );
if( m_ClientPI.hProcess )
CloseHandle(m_ClientPI.hProcess);
if( m_ClientPI.hThread )
CloseHandle(m_ClientPI.hThread);
ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );
m_ClientSI.cb = sizeof(m_ClientSI);
ZeroMemory(&m_ClientPI, sizeof(m_ClientPI));
LPSTR lpath("C:\\Users\\Administrator.GQ6I8IXUJ0HGASZ\\Desktop\\共享内存\\MyShareClient\\Debug\\MyShareClient.exe");
if( !CreateProcess( NULL,
lpath,
NULL,
NULL,
TRUE,//1.重点
0,
NULL,
NULL,
&m_ClientSI,
&m_ClientPI) )
{
ZeroMemory( &m_ClientSI, sizeof(m_ClientSI) );
m_ClientSI.cb = sizeof(m_ClientSI);
}
child:
LPCTSTR lpName("server001");
int nlength = ::GetEnvironmentVariable(lpName,NULL,0);
LPSTR lpValue = new char[nlength+1];
memset(lpValue,'\0',nlength+1);
::GetEnvironmentVariable(lpName,lpValue,nlength+1);
//OutputDebugString(lpValue);
AfxMessageBox(lpValue,MB_OK,0);
上面一个是父进程,主要负责写入环境变量,调用子进程;另一个是子进程,读取环境变量的值。
【注意】:
(1.)如果不是用CreateProcess方式,那么直接启动两个进程是得不到信息的。
(2.)上面写入环境变量的值应该是某个内核对象的句柄值,这边就用简单的数值表示下。
::SetEnvironmentVariable(lpName,lpValue);
(3.)parent代码中有个重点,参数bInheritHandles是表示子进程是否继承父进程中的内核对象,如果环境变量lpValue表示句柄值,那么此处就应该设置为TRUE.
3.截图(得到的环境变量值)
(1.)平级进程
(2.)父子进程