环境变量env(envget,envput,envset)

1.概述

环境变量在操作系统中扮演着重要的角色,它提供了一种机制来存储和传递关于系统环境的关键信息。

  1. 简化程序配置
    • 环境变量允许程序在运行时访问必要的配置信息,而无需将这些信息硬编码到程序代码中。
    • 通过环境变量,可以轻松地更改配置而不必重新编译程序。
  2. 资源定位
    • 环境变量可以帮助程序找到所需的文件或资源的位置,比如配置文件、库文件或数据文件。
    • 例如,PATH 环境变量告诉系统去哪里查找可执行文件。
  3. 提高可移植性
    • 环境变量使得程序可以在不同的环境中使用相同的配置逻辑,而不需要修改程序本身。
    • 这样可以更容易地将程序部署到不同的系统上。
  4. 增加安全性
    • 敏感信息(如密码或API密钥)可以通过环境变量传递给程序,而不是直接写入源代码,从而增加了安全性。
    • 在多用户环境中,环境变量可以限制敏感信息的暴露范围。
  5. 跨程序共享信息
    • 不同的应用程序可以通过环境变量来共享配置信息,而不需要额外的通信机制。
    • 例如,邮件客户端可以通过环境变量来确定用户的邮件目录。
  6. 方便系统管理
    • 系统管理员可以通过设置环境变量来调整系统行为,例如设置默认的语言环境或临时文件夹的位置。
  7. 支持多用户环境
    • 环境变量可以区分不同用户的个性化设置,例如每个用户的主目录或临时文件夹。
  8. 易于调试和维护
    • 通过更改环境变量,可以快速测试不同的配置选项,而不需要重新编译或重新部署程序。

设置和获取环境变量可以通过编程接口(API)和命令行工具(Shell 命令)来实现。

2.设计
2.1 设计目标:
  1. 内核态管理一个表,可以称为系统级的环境目标。
  2. 环境变量接口:getenv、putenv、setenv、unsetenv
  3. shell命令查询所有内核态的环境变量。
2.2 设计实现:

environ 的结构:

  1. 一级指针 (char **):environ 是一个指向字符指针数组的指针。这意味着它实际上是指向一个数组的指针,而数组中的每个元素本身也是一个指针。
  2. 二级指针 (char *):数组中的每个元素都是一个 char * 类型的指针,指向一个字符串(环境变量名和值的组合)。
  3. 字符串 (char):每个 char * 指向的字符串是由等号 (=) 分隔的环境变量名和值。例如 "PATH=/usr/local/bin:/usr/bin"

假设 environ 包含了以下环境变量:

  • "HOME=/home/user"
  • "PATH=/usr/local/bin:/usr/bin"
  • "LANG=en_US.UTF-8"
    environ 的内部结构看起来像这样:
+----------------+-------------------+----------------------+NULL
2| environ[0]     | environ[1]        | environ[2]           |
3| -> "HOME=/home/| -> "PATH=/usr/loc| -> "LANG=en_US.UTF-8|
4| user"          | al/bin:/usr/bin"  | "                 |
5+----------------+-------------------+----------------------+NULL

资源保护:
使用自旋锁,保护的内容就是environ。因为处理保护的资源占用时间很短,因此选择自旋锁,而不是互斥锁,以减少不必要的上下文切换和调度延迟。

资源分配:
realloc 是 C 语言标准库中的一个函数,用于改变已分配内存块的大小。它的主要作用是在不丢失原有数据的情况下调整内存块的大小,这对于动态调整数组或其他数据结构的大小非常有用。

入参检查:支持

错误码设置:支持

environ内核态下全局环境变量,不对TCB结构体作更改

3.API和CMD

在 C 语言中,我们可以使用标准库中的函数来设置和获取环境变量。如:getenv、putenv、setenv、unsetsenv。

使用printenv 命令来显示环境变量的值。例如,要获取名为 MY_VARIABLE 的环境变量的值:

printenv MY_VARIABLE

使用 export 命令来设置环境变量。例如,要设置名为 MY_VARIABLE 的环境变量:

export MY_VARIABLE=example
4.源码路径

源码放在:
libc\musl\arm64\kernel\src\env
头文件:
stdlib.h本身有声明,如下:

char *getenv (const char *);
int setenv (const char *, const char *, int);
int unsetenv (const char *);
int putenv (char *);
5.参考

主要参考:zephyr、musl、nuttx

5.1 zephyr

environ:全局环境变量
资源保护:自旋锁

5.2 musl

environ:全局环境变量
资源保护:没有

5.3 nuttx

environ:私有环境变量,这时需要保存在tcb中:

struct task_group_s *group;

#ifndef CONFIG_DISABLE_ENVIRON
  /* Environment variables **************************************************/
  FAR char **tg_envp;               /* Allocated environment strings        */
  ssize_t    tg_envc;               /* Number of environment strings        */
#endif

资源保护:关调度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值