如何从程序中获得/设置环境变量?火急,回答完立即给分。

vidfancy 2003-09-26 08:26:27
如何从程序中获得/设置环境变量?,火急,回答完立即给分。
...全文
170 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jaland 2003-09-26
  • 打赏
  • 举报
回复
有,老兄,我在补充一下怎样读取整个环境变量表?

如果你不知道确切你想要的环境变量的名字,那么‘getenv()’函数不是很有用。在这种情况下,你必须更深入了解环境变量表的存储方式。

全局变量,‘char **envrion’,包含指向环境字符串指针数组的指针,每一个字符串的形式为‘“NAME=value”’(和putenv()中的“string”的格式相同)。
这个数组以一个‘空’(NULL)指针标记结束。这里是一个打印当前环境变量列表的小程序(类似‘printenv’)。

#include

extern char **environ;

int main()
{
char **ep = environ;
char *p;
while ((p = *ep++))
printf("%s\n", p);
return 0;
}

一般情况下,‘envrion’变量作为可选的第三个参数传递给‘main()’;就是说,上面的程序可以写成:

#include

int main(int argc, char **argv, char **envp)
{
char *p;
while ((p = *envp++))
printf("%s\n", p);
return 0;
}

虽然这种方法被广泛的操纵系统所支持(译者注:包括DOS),这种方法事实上并没有被POSIX标准所定义。(一般的,它也比较没用)
vidfancy 2003-09-26
  • 打赏
  • 举报
回复
sigh!好好兄及时雨啊!还有人要风吗?等一会揭帖了!!!
haothinking 2003-09-26
  • 打赏
  • 举报
回复
获得一个环境变量可以通过调用‘getenv()’函数完成。

#include

char *getenv(const char *name);

设置一个环境变量可以通过调用‘putenv()’函数完成。

#include

int putenv(char *string);

变量string应该遵守"name=value"的格式。已经传递给putenv函数的字符串不能够被释放或变成无效,因为一个指向它的指针将由‘putenv()’保存。这意味着它必须是在静态数据区中或是从堆(heap)分配的。如果这个环境变量被另一个‘putenv()’的调用重新定义或删除,上述字符串可以被释放。
因为putenv()有这样的局限,在使用中经常会导致一些错误,GNU libc 中还包括了两个BSD风格的函数:
#include
int setenv(const char *name, const char *value, int replace);
void unsetenv(const char *name);

setenv()/unsetenv()函数可以完成所有putenv()能做的事。setenv() 可以不受指针限制地向环境变量中添加新值,但传入参数不能为空(NULL)。当replace为0时,如果环境变量中已经有了name项,函数什么也不做(保留原项),否则原项被覆盖。
unsetenv()是用来把name项从环境变量中删除。注意:这两个函数只存在在BSD和GNU库中,其他如SunOS系统中不包括它们,因此将会带来一些兼容问题。我们可以用getenv()/putenv()来实现:

int setenv(const char *name, const char *value, int replace)
{
char *envstr;

if (name == NULL || value == NULL)
return 1;
if (getenv(name) !=NULL)
{
envstr = (char *) malloc(strlen(name) + strlen(value) + 2);
sprintf (envstr, "%s=%s", name, value);
if (putenv(envstr));
return 1;
}
return 0;
}
*/

记住环境变量是被继承的;每一个进程有一个不同的环境变量表拷贝(从core文件中我们可以看出这一点)。结果是,你不能从一个其他进程改变当前进程的环境变量,比如shell进程。

假设你想得到环境变量‘TERM’的值,你需要使用下面的程序:

char *envvar;

envvar=getenv("TERM");

printf("The value for the environment variable TERM is ");
if(envvar)
{
printf("%s\n",envvar);
}
else
{
printf("not set.\n");
}

现在假设你想创建一个新的环境变量,变量名为‘MYVAR’,值为‘MYVAL’。
以下是你将怎样做:

static char envbuf[256];

sprintf(envbuf,"MYVAR=%s","MYVAL");

if(putenv(envbuf))
{
printf("Sorry, putenv() couldn't find the memory for %s\n",envbuf);
/* Might exit() or something here if you can't live without it */
}
内容概要:本文围绕永磁同步电机(PMSM)的矢量控制技术展开系统性研究,重点阐述了基于Simulink平台构建PMSM速度控制仿真模型的方法与实践。文章深入剖析了矢量控制的核心原理,包括Clarke变换与Park变换在内的坐标变换理论、磁场定向控制(FOC)策略、电流环与速度环构成的双闭环控制系统结构,以及空间矢量脉宽调制(SVPWM)技术在逆变器驱动中的应用。通过Simulink仿真实现完整的控制架构,对系统的动态响应特性进行了分析与验证,充分展示了该控制策略在调速性能、转矩响应和鲁棒性方面的优越表现。; 适合人群:具备电机控制、电力电子及自动控制理论基础,从事电气工程、自动化、新能源汽车、智能制造等相关领域研究与开发工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解PMSM矢量控制的理论体系与关键技术细节;②掌握利用Simulink进行电机控制系统建模、仿真与性能评估的方法;③为高性能电机驱动器的设计与优化提供理论依据和技术参考。; 阅读建议:建议读者结合Simulink软件动手复现仿真模型,重点理解各功能模块的参数设计与相互关联,关注PI控制器的整定过程与SVPWM模块的实现逻辑,并可通过改变负载或参考转速来观察系统响应,从而加深对控制策略的理解与掌握。
已经博主授权,源码转载自 https://pan.quark.cn/s/27084300a254 《面向iOS设备的MFi认证文档:Accessory Interface Specification R31的深入解析》 苹果的MFi(Made for iPhone/iPod/iPad)认证是一项针对第三方配件生产厂商的核心准则,其核心目标在于保障配件与苹果设备之间的互操作性和安全性。Accessory Interface Specification R31是此项认证的当前最新版本,系统性地阐述了开发适用于iOS平台配件所必须遵循的技术准则与具体要求。 1. **规范宗旨** 该技术文档的主要功能在于明确Apple认证配件应遵守的设计理念、功能特性以及性能指标,从而确保这些配件能够与iOS设备实现无障碍的协同作业。 2. **文档布局** 该规范被划分为多个章节,涵盖了设备适配性、测试流程、开发资源、参考模型、安全机制以及无线传输效能等多个维度,为生产厂商指明了明确的开发方向。 3. **适用范畴** 该规范适用于所有意图与iOS设备实现兼容的外部设备,无论其通过物理线路还是无线方式连接,均需满足其中的各项条件。 4. **必要条件、建议措施与授权管理** 配件设计者不仅必须遵循强制性的规范要求,同时亦需兼顾推荐的实施方法与权限配置,以期达到最优的用户交互体验和设备安全防护。 5. **预发布测试阶段** 文档中提供了开发者测试版与生产厂商测试版,使开发者在产品正式上市前能够进行充分的测试和改进。 6. **专业术语阐释** 该规范中界定了诸如“设备”、“配件”、“认证协处理器”等核心概念,旨在辅助读者准确理解文档内容。 7. **配件具体要求** - 基础设备兼容性:必须...

23,224

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧