Windows下利用C语言程序设置环境变量---能否用环境变量实现进程间的通信?

972 篇文章 328 订阅
24 篇文章 11 订阅

      先看什么是环境变量吧, 在Windows的cmd中, 我们输入一下set命令, 得到:

C:\Documents and Settings\Administrator>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrator\Application Data
CLIENTNAME=Console
CommonProgramFiles=C:\Program Files\Common Files

.......

    我们注意到, 每行都有一个"="号, 前面的叫环境变量名, 后面的叫环境变量的值。  我们再执行一下: set | findstr -i username, 得到的结果为:

C:\Documents and Settings\Administrator>set | findstr -i username
USERNAME=Administrator

    也就是说, 环境变量USERNAME的值是Administrator, 下面, 我们通过程序来获取一下这个东东:

 

#include <stdlib.h>
#include <stdio.h>

int main()
{
	const char *pEn = getenv("USERNAME");
	if (pEn)
	{
		printf("pEn is:\n%s\n", pEn);
	}
	else
	{
		printf("undefined\n");
	}

	return 0;
}

     我们看到, 程序结果为:

 

pEn is:
Administrator

 

     当然, 如果本来不存在某环境变量, 上面程序就会走入else分支。 下面, 我们看看如何用程序来设置自己想设置的环境变量:

 

#include <stdlib.h>
#include <stdio.h>

int main()
{
	const char *pEn = getenv("testName");
	if (pEn)
	{
		printf("pEn is:\n%s\n", pEn);
	}
	else
	{
		printf("undefined\n");
	}

	int iRet = putenv("testName=beauty");
	if (iRet < 0)
	{
		printf("error\n");
	}
	else
	{
		printf("set successfully\n");
	}

	pEn = getenv("testName");
	if (pEn)
	{
		printf("pEn is:\n%s\n", pEn);
	}
	else
	{
		printf("undefined\n");
	}

	return 0;
}

       程序结果为:

 

undefined
set successfully
pEn is:
beauty

      这多么好啊, 于是我还打算用这个方法实现进程间的通信, 以为进程都可以访问testName,  然而, 我错了, 因为上面的putenv设置的环境变量仅在当前进程中有效, 我连续两次运行上述程序, 发现都是一样的结果, 这说明第二个进程无法感知到testName, 而且, 我们在cmd中执行一下set | findstr -i testname, 也发现没有增加testName这个环境变量。 好吧, 看来进程通信的想法是遇到一些问题了。 如果以后找到了用程序(函数)设置系统环境的方法, 我再来完善本文。

 

      在Android系统中, 我们经常用setprop和getprop命令来设置和获取环境变量, 当然也有对应的函数来实现这个功能, 而且设置的是系统的环境变量, 不同进程间是可以访问同一环境变量的, 这样就可以实现两个进程间的通信了, 确实可行, 而且非常普遍。

 

      说到这里, 本文标题的疑问就释然了, 能否用环境变量实现进程间的通信, 取决于所设的环境变量是否为系统环境变量(永久生效的)。好吧, 先这样。

 

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是书的光盘。共分为两个部分,这是第一部分。 本书由浅入深、循序渐进地介绍了Windows驱动程序的开发方法与调试技巧。本书共分23章,内容涵盖了 Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱 动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动程序 、虚拟串口驱动程序、摄像头驱动程序、SDIO驱动程序进行了详细的介绍,本书最大的特色在于每一节 的例子都是经过精挑细选的,具有很强的针对性。力求让读者通过亲自动手实验,掌握各类Windows驱动 程序的开发技巧,学习尽可能多的Windows底层知识。   本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试的方法。   从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例详细讲解 PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如 用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析Windows驱动 开发的本质。 本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技 巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导意义 ,是一本值得推荐的专著。              ——中国工程院院士   院士推荐   目前,电子系统设计广泛采用通用操作系统,达到降低系统的设计难度和缩短研发周期。实现操作 系统与硬件快速信息交换是电子系统设计的关键。   通用操作系统硬件驱动程序的开发,编写者不仅需要精通硬件设备、计算机总线,而且需要Windows 操作系统知识以及调试技巧。学习和掌握Windows硬件驱动程序的开发是电子系统设计人员必备的能力。   本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,并且介绍了编 程技巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导 意义,是一本值得推荐的专著。 第1篇 入门篇 第1章 从两个最简单的驱动谈起 本章向读者呈现两个最简单的Windows驱动程序,一个是NT式的驱动程序,另一个是WDM式的驱动程序。 这两个驱动程序没有操作具体的硬件设备,只是在系统里创建了虚拟设备。在随后的章节中,它们会作 为基本驱动程序框架,被本书其他章节的驱动程序开发所复用。笔者将带领读者编写代码、编译、安装 和调试程序。   1.1 DDK的安装   1.2 第一个驱动程序HelloDDK的代码分析    1.2.1 HelloDDK的头文件    1.2.2 HelloDDK的入口函数    1.2.3 创建设备例程    1.2.4 卸载驱动例程    1.2.5 默认派遣例程   1.3 HelloDDK的编译和安装    1.3.1 用DDK环境编译HelloDDK    1.3.2 用VC集成开发环境编译HelloDDK    1.3.3 HelloDDK的安装   1.4 第二个驱动程序HelloWDM的代码分析    1.4.1 HelloWDM的头文件    1.4.2 HelloWDM的入口函数    1.4.3 HelloWDM的AddDevice例程    1.4.4 HelloWDM处理PNP的回调函数    1.4.5 HelloWDM对PNP的默认处理    1.4.6 HelloWDM对IRP_MN_REMOVE_DEVICE的处理    1.4.7 HelloWDM对其他IRP的回调函数    1.4.8 HelloWDM的卸载例程   1.5 HelloWDM的编译和安装    1.5.1 用DDK编译环境编译HelloWDM    1.5.2 HelloWDM的编译过程    1.5.3 安装HelloWDM   1.6 小结  第2章 Windows操作驱动的基本概念  驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主 要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序通信方法。   2.1 Windows操作系统概述    2.1.1 Windows家族    2.1.2 Windows特性    2.1.3 用户模式和内核模式    
c语言提供了一些用于进程操作的相关函数。下面简要介绍几个常用的函数。 1. fork()函数:该函数用于创建新的进程。调用该函数会复制当前进程,使得原进程和新进程同时运行。原进程称为父进程,新进程称为子进程。父子进程代码段和全局变量相同,但拥有独立的栈空和唯一的进程ID。 2. exec()函数族:exec函数族用于在一个进程中执行新的程序。这些函数会在调用进程的地址空中加载新的程序,并开始执行。exec函数族的几个常用函数有:execv()、execvp()、execve()。这些函数通过传递命令行参数、环境变量等信息,用新程序替换当前进程。 3. wait()函数:该函数用于使父进程等待子进程执行结束,并获取其退出状态。当子进程终止时,父进程可以根据wait函数返回的状态信息,判断子进程的终止方式和退出状态。如果子进程尚未终止,调用wait函数会使父进程阻塞,直到有子进程结束。 4. kill()函数:该函数用于向指定的进程发送信号。进程可以通过信号来通信,比如终止进程、暂停进程等。kill函数通过指定目标进程进程ID和信号编号,向目标进程发送信号。 5. getpid()函数:该函数用于获取当前进程进程ID。每个进程有唯一的进程ID,可以通过getpid函数获取该进程ID。这对于进行进程管理和进程通信很有用。 总之,C语言提供了丰富的进程操作相关函数,可以用于创建、替换、等待进程,以及发送信号等操作。这些函数为进程管理和进程通信提供了丰富的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值