飞凌嵌入式ElfBoard-环境变量之添加修改环境变量setenv

setenv() 函数可以向进程的环境变量列表中添加新的环境变量,或者修改现有环境变量的值。相比 putenv(),setenv() 提供了更安全的方式来操作环境变量,因为它会复制传入的变量和值,不会出现由于字符串的生命周期导致环境变量失效的问题。

1)头文件

#include <stdlib.h>

2)函数原型

int setenv(const char *name, const char *value, int overwrite);

3)参数

name:需要添加或修改的环境变量名称。这个名称必须是有效的环境变量名,通常由字母、数字和下划线组成,且不能以数字开头。

value:要设置的环境变量的值。可以是任何字符串,可以为空字符串("")。

overwrite: 是否覆盖已存在的环境变量。如果为非零值,表示覆盖已存在的环境变量;如果为 0,表示不覆盖。

4)返回值

如果成功,返回 0。如果失败,返回 -1,并且设置 errno 以指示错误原因。常见的错误包括:EINVAL: 环境变量名无效。ENOMEM: 内存不足。

5)setenv与putenv区别

⚫setenv() 会为 name=value 的字符串分配新的内存,并将传入的 name 和 value 复制到这块内存中;这意味着即使原始字符串被修改或释放,环境变量依然有效。setenv() 提供了一个 overwrite 参数,可以控制是否覆盖已有的环境变量;如果 overwrite 为 0,且变量已存在,则不会修改该变量。setenv() 通过传入 name 和 value 两个参数来设置环境变量,结构清晰且安全。

⚫putenv() 不会分配新的内存,而是直接使用传入的字符串。因此,如果传入的字符串在设置后被修改或释放,环境变量的值也会受到影响。putenv() 没有这种控制机制,每次调用都会覆盖或添加环境变量。putenv() 需要传入一个形如 "name=value" 的字符串,使用上较为直接,适合简单场景,但缺乏安全性和灵活性。

6)示例:通过setenv()函数添加修改环境变量

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdio.h> #include <stdlib.h> int main() { // 设置环境变量 MY_VAR 为 "12345",并且允许覆盖已有变量 if (setenv("MY_VAR", "12345", 1)) { perror("setenv failed"); return 1; } // 打印 MY_VAR 的值 printf("MY_VAR: %s\n", getenv("MY_VAR")); // 修改环境变量 MY_VAR 的值为 "67890" if (setenv("MY_VAR", "67890", 1)) { perror("setenv failed"); return 1; } // 打印修改后的 MY_VAR 值 printf("Updated MY_VAR: %s\n", getenv("MY_VAR")); // 清除 MY_VAR 环境变量 if (unsetenv("MY_VAR")) { perror("unsetenv failed"); return 1; } // 尝试获取已删除的 MY_VAR,结果应为 NULL if (getenv("MY_VAR") == NULL) { printf("MY_VAR has been unset\n"); } return 0; } |

7)运行结果

|-----------------------------------------------------------|
| MY_VAR: 12345 Updated MY_VAR: 67890 MY_VAR has been unset |

8)代码解析

使用 setenv("MY_VAR", "12345", 1) 设置环境变量 MY_VAR 的值为 "12345"。第三个参数为 1,表示如果该变量已经存在,则覆盖它的值。使用 getenv("MY_VAR") 获取并打印 MY_VAR 的值。再次使用 setenv() 修改 MY_VAR 的值为 "67890",并再次打印。

使用 unsetenv("MY_VAR") 清除环境变量 MY_VAR。检查 MY_VAR 是否已被删除,如果 getenv() 返回 NULL,则说明变量已被成功删除。

相关推荐
风骏时光牛马1 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
测试界的小码农1 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
wangruofeng2 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding2 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
艺杯羹3 小时前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
johnjincaaaa3 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
鶴哥只手遮天3 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron
女神下凡5 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
FungLeo5 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构