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,'\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.)父子进程



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值