C/C++ 日常学习总结(第二十三篇)父子进程间通信——环境变量
前面的共享内存(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," ",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.)父子进程
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C#操作注册表,设置系统环境变量
- 下一篇: vue中实现先请求数据再渲染dom