C语言setenv()原理

setenv()定义在<stdlib.h>,设置或者更新环境变量。

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

成功返回0,失败返回-1并设置错误码。
如果没有该name项则设置。有则更新。
我想谈一谈的是该环境变量是否和 环境变量文件如 .bashrc 有关

由于之前开发过程是通过修改~/.bashrc文件,控制环境变量,所以对于setenv()做一个学习研究。

setenv()是通过修改进程内存空间的形式来修改环境变量,一般不会影响其他的进程,不过子进程除外。因为进程拥有地址空间是独立分开的,这也是虚拟内存的一个作用。不是线程安全函数。

原理 setenv() 流程:

  1. 检查输入参数: 检查参数是否有效。
  2. 查找和修改:
    • 如果 overwrite 参数为非零值,setenv() 将查找环境变量列表,并修改其值。
    • 如果 overwrite 参数为零且环境变量已存在,函数将不进行更改。
  3. 内存分配:
    • 根据需要,setenv() 可能会在内部申请空间来存储新的环境变量名和它的值(通常是在 heap 上)。
    • 如果分配成功,新的环境变量将被添加到环境变量列表中。
  4. 更新环境变量列表: setenv() 将新的值添加到环境变量列表,后续的调用(比如 getenv())能够访问到更新后的环境变量。
  5. 错误处理: 如果在过程中遇到任何错误,尤其是在内存分配方面,函数会返回 -1并设置 errno。

验证:修改一下环境变量试试效果如何?
使用命令查看一下文件~/.bashrc文件
然后运行之后再次查看一下~/.bashrc文件

在这里插入图片描述

事实是无任何变化。
实际上该函数操作的是内存,而非文件。程序运行时每次都会载入环境到虚拟内存。C/C++内存模型如下

在这里插入图片描述

可见,命令行参数和环境变量一同布局在进程顶部空间。此处空间一般是固定大小,无法修改,如果有新的环境变量加入,会在堆上申请空间并存储。

进程的环境变量可以通过全局变量访问,定义形式char **environ其定在<unistd.h>。遍历方法:

#include <stdio.h>  
#include <unistd.h>  

extern char **environ;  // 声明 environ  

int main() {  
    // 遍历并打印所有环境变量  
    for (char **env = environ; *env != NULL; env++) {  
        printf("%s\n", *env);  
    }  
    return 0;  
}

在这里插入图片描述

所以,对于测试或者其它的一些依赖修改环境变量的程序,可以在其内部调用setenv这类函数进行动态修改,不会影响系统配置文件,很友好。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值