嵌入式Linux系统编程 — 7.2 进程的环境变量

目录

1 什么是进程的环境变量

2 环境变量的作用

3 应用程序中获取环境变量

3.1 environ全局变量

3.2 获取指定环境变量 getenv

4 添加/删除/修改环境变量

4.1 putenv()函数添加环境变量

4.2 setenv()函数

4.3 unsetenv()函数


1 什么是进程的环境变量

每一个进程都有一组与其相关的环境变量, 这些环境变量以字符串形式存储在一个字符串数组列表中,把这个数组称为环境列表。 其中每个字符串都是以“名称=值(name=value)” 形式定义,所以环境变量是“名称-值”的成对集合。

譬如在 shell 终端下可以使用 env 命令查看到 shell 进程的所有环境变量,如下所示:

使用 export 命令还可以添加一个新的环境变量或删除一个环境变量:

export LINUX_TEST=123456 # 添加 LINUX_TEST 环境变量

使用"export -n LINUX_TEST"命令则可以删除 LINUX_TEST 环境变量。

2 环境变量的作用

环境变量主要有以下几个作用:

  • 配置应用程序:环境变量可以用于存储应用程序的配置信息,如文件路径、配置选项等。这使得应用程序可以在不同的环境中使用相同的代码,但根据环境变量的不同而表现出不同的行为。

  • 传递信息:在进程创建时,父进程的环境变量可以传递给子进程。这允许在不同程序之间共享信息,例如,用户的家目录路径通常通过环境变量 HOME 传递。

  • 控制shell行为:在shell中,环境变量控制着许多行为,如提示符的格式、别名、shell脚本的搜索路径等。

3 应用程序中获取环境变量

3.1 environ全局变量

应用程序当中也可以获取当前进程的环境变量,事实上,进程的环境变量是从其父进程中继承过来的,譬如在 shell 终端下执行一个应用程序,那么该进程的环境变量就是从其父进程(shell 进程)中继承过来的。新的进程在创建之前,会继承其父进程的环境变量副本。

环境变量存放在一个字符串数组中,在应用程序中,通过 environ 变量指向它, environ 是一个全局变量,在我们的应用程序中只需申明它即可使用,如下所示:

extern char **environ; // 申明外部全局变量 environ

编写应用程序,获取进程的所有环境变量。

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

extern char **environ;

int main() 
{
    // 遍历环境变量数组
    while (*environ != NULL) {
        printf("%s\n", *environ);
        environ++;
    }

    return 0;
}

运行结果如下,可以看到和‘evn’命令行有相同的结果。

3.2 获取指定环境变量 getenv

如果只想要获取某个指定的环境变量,可以使用库函数 getenv(),其函数原型如下所示:

#include <stdlib.h>

char *getenv(const char *name);
  • name: 指定获取的环境变量名称。
  • 返回值: 如果存放该环境变量,则返回该环境变量的值对应字符串的指针;如果不存在该环境变量,则返回 NULL。

下面是一个使用 getenv() 函数获取这个环境变量的值的示例程序:

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

int main(int argc, char *argv[]) 
{
    // 检查是否提供了环境变量名称作为命令行参数
    if (argc != 2) {
        printf("Usage: %s <environment-variable-name>\n", argv[0]);
        return 1;
    }

    // 获取环境变量的值
    const char *value = getenv(argv[1]);

    if (value != NULL) {
        printf("The value of '%s' is: %s\n", argv[1], value);
    } else {
        printf("The environment variable '%s' is not set.\n", argv[1]);
    }

    return 0;
}

 通过程序查看SHELL环境变量的值,

4 添加/删除/修改环境变量

C 语言函数库中提供了用于修改、添加、删除环境变量的函数,譬如 putenv()、 setenv()、 unsetenv()、clearenv()函数等。

4.1 putenv()函数添加环境变量

putenv() 函数用于添加或修改环境变量的函数。它接收一个字符串参数,该字符串应该包含环境变量的名称和值,两者之间用等号(=)连接。如果环境变量已经存在,putenv() 会更新它的值;如果不存在,它将添加一个新的环境变量。其函数原型如下所示:

#include <stdlib.h>

int putenv(char *string);
  • string: 参数 string 是一个字符串指针,指向 name=value 形式的字符串。
  • 返回值: 成功返回 0;失败将返回非 0 值,并设置 errno。

使用 putenv()函数为当前进程添加一个环境变量。

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

int main(int argc, char *argv[])
{
    if (2 > argc) {
        fprintf(stderr, "Error: 传入 name=value\n");
        exit(-1);
    }
    /* 添加/修改环境变量 */
    if (putenv(argv[1])) {
        perror("putenv error");
        exit(-1);
    }
    exit(0);
}

运行结果如下:

4.2 setenv()函数

setenv()函数可以替代 putenv()函数,用于向进程的环境变量列表中添加一个新的环境变量或修改现有环境变量对应的值,其函数原型如下所示:

#include <stdlib.h>

int setenv(const char *name, const char *value, int overwrite);
  • name: 需要添加或修改的环境变量名称。
  • value: 环境变量的值。
  • overwrite: 若参数 name 标识的环境变量已经存在,在参数 overwrite 为 0 的情况下, setenv()函数将不改变现有环境变量的值,也就是说本次调用没有产生任何影响;如果参数 overwrite 的值为非 0,若参数 name标识的环境变量已经存在,则覆盖,不存在则表示添加新的环境变量。
  • 返回值: 成功返回 0;失败将返回-1,并设置 errno。

setenv()与 putenv()函数有两个区别:

  • putenv()函数并不会为 name=value 字符串分配内存;
  • setenv()可通过参数overwrite控制是否需要修改现有变量的值而仅以添加变量为目的,显然putenv()并不能进行控制。

setenv()函数使用示例程序如下:

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

int main(int argc, char *argv[]) 
{
    // 检查是否提供了环境变量名称和值
    if (argc != 3) {
        printf("Usage: %s <variable-name> <value>\n", argv[0]);
        return 1;
    }

    // 使用 setenv 函数添加或修改环境变量
    // setenv 返回 0 表示成功,非 0 表示错误
    if (setenv(argv[1], argv[2], 1) != 0) {
        perror("Failed to set environment variable");
        return 1;
    }

    // 打印环境变量的值以验证
    const char *value = getenv(argv[1]);
    if (value != NULL) {
        printf("%s is now set to: %s\n", argv[1], value);
    } else {
        printf("Failed to retrieve the set environment variable.\n");
    }

    return 0;
}

程序首先检查是否提供了正确的参数数量。如接下来,程序使用 setenv() 函数来设置环境变量。setenv() 的第三个参数设置为 1,表示如果环境变量已经存在,允许覆盖它的值。然后,程序使用 getenv() 函数来验证环境变量是否已正确设置,并打印出它的值。运行结果如下:

4.3 unsetenv()函数

unsetenv() 是 POSIX 标准中定义的一个函数,用于从当前进程的环境中删除指定的环境变量。这个函数的原型通常如下:

#include <stdlib.h>

int unsetenv(const char *name);
  • name :要删除的环境变量的名称。
  • 返回值:如果环境变量成功被删除,unsetenv() 会返回 0;如果发生错误,比如尝试删除不存在的变量,会返回非零值。

下面是一个使用 unsetenv() 函数的示例程序,它接受一个命令行参数(环境变量的名称),并尝试从当前进程的环境中删除这个变量:

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

int main(int argc, char *argv[]) 
{
    // 检查是否提供了环境变量名称
    if (argc != 2) {
        printf("Usage: %s <environment-variable-name>\n", argv[0]);
        return 1;
    }

    // 尝试删除环境变量
    if (unsetenv(argv[1]) == -1) {
        perror("Failed to unset environment variable");
        return 1;
    }

    // 验证环境变量是否被删除
    const char *value = getenv(argv[1]);
    if (value == NULL) {
        printf("The environment variable '%s' has been unset.\n", argv[1]);
    } else {
        printf("The environment variable '%s' is still set to: %s\n", argv[1], value);
    }

    return 0;
}

运行结果如下: 



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/777686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android - Json/Gson

Json数据解析 json对象&#xff1a;花括号开头和结尾&#xff0c;中间是键值对形式————”属性”:属性值”” json数组&#xff1a;中括号里放置 json 数组&#xff0c;里面是多个json对象或者数字等 JSONObject 利用 JSONObject 解析 1.创建 JSONObject 对象&#xff0c;传…

快手大模型首次集体亮相,用AI重塑内容与商业生态

7月6日&#xff0c;在2024世界人工智能大会期间&#xff0c;快手举办了以“新AI新应用新生态”为主题的大模型论坛&#xff0c;会上&#xff0c;快手大模型首次集体亮相&#xff0c;视频生成大模型可灵、图像生成大模型可图等产品的多项新功能正式发布。 继图生视频、视频续写…

Appium启动APP时报错Security exception: Permission Denial

报错内容Security exception: Permission Denial: starting Intent 直接通过am命令尝试也是同样的报错 查阅资料了解到&#xff1a;android:exported | App quality | Android Developers exported属性默认false&#xff0c;所以android:exported"false"修改为t…

QT学习积累——如何提高Qt遍历list的效率

目录 引出Qt遍历list提高效率显示函数的调用使用&与不使用&除法的一个坑 总结自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重载带参数的按钮触发信号触发信号拓展 lambda表达式返回值mutable修饰案例 引出 QT学习积累——如何提高Qt遍历list…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Kotlin中的数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

用C#调用Windows API向指定窗口发送按键消息详解与示例

文章目录 1. 按键消息的定义及功能2. 引入所需的命名空间3. 定义Windows API函数4. 定义发送消息的方法5. 获取窗口句柄6. 调用API发送按键消息7. 使用示例注意事项总结 在C#中调用Windows API向指定窗口发送按键消息是一种常见的操作&#xff0c;这通常用于自动化脚本、游戏辅…

加密货币大利好!9月降息概率突破70%!美国可能大幅降息或多次降息?

根据最新消息&#xff0c;美国9月降息的概率已经突破70%&#xff0c;这对加密货币市场来说是个利好消息。与此同时&#xff0c;美国经济表现疲软&#xff0c;可能会陷入衰退&#xff0c;联邦储备系统(Fed)接下来会不会果断采取大幅降息措施备受关注。 美国劳工统计局7月5日公布…

前端面试项目细节重难点(十)(已工作|做分享)

面试官&#xff1a;现场出需求&#xff1a;我想让一个左侧盒子可以进行拉伸、缩小、展示或隐藏这些功能&#xff0c;你会如何实现&#xff1f; 答&#xff1a;&#xff08;1&#xff09;分析问题&#xff1a;其实&#xff0c;我听到这个问题后&#xff1a; 我的第一种想法&am…

E1.【C语言】练习:用函数求两个整数的较大值

有关创建函数见&#xff1a; 12.【C语言】创建函数 写法 1&#xff1a;if语句 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int max(int a, int b) {if (a > b)return a;elsereturn b; } int main() {int a 0;int b 0;scanf("%d%d", &a,…

迎接AI新时代:GPT-5即将登场的巨大变革与应用前瞻

迎接AI新时代&#xff1a;GPT-5即将登场的巨大变革与应用前瞻 &#x1f48e;1. GPT-5 一年半后发布&#xff1a;AI新时代的来临1.1 GPT-5的飞跃&#xff1a;从高中生到博士生 &#x1f48e;2. GPT-5的潜在应用场景&#x1f48e;2.1 医疗诊断和健康管理&#x1f48e;2.2 教育领域…

生产力工具|VS Code安装及使用指南

一、VS Code介绍 &#xff08;一&#xff09;软件介绍 Visual Studio Code&#xff08;简称VS Code&#xff09;是由Microsoft开发的免费开源代码编辑器&#xff0c;适用于Windows、macOS和Linux操作系统。它支持多种编程语言&#xff0c;如JavaScript、Python、C等&#xff0…

Python爬虫获取视频

验证电脑是否安装python 1.winr输入cmd 2.在黑窗口输入 python.exe 3.不是命令不存在就说明python环境安装完成 抓取快手视频 1.在phcharm应用中新建一个项目 3.新建一个python文件 4.选择python文件,随便起一个名字后按回车 5.安装requests pip install requests 6.寻找需要的…

Selenium 切换 frame/iframe

环境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19说明&#xff1a; driver.switch_to.frame() # 将当前定位的主体切换为frame/iframe表单的内嵌页面中 driver.switch_to.default_content() # 跳回最外层的页面# 判断元素是否在 frame/ifame 中 # 126 邮箱为例 # …

半同步主从复制

半同步主从复制的概念 半同步主从复制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL数据库中的一种数据复制方式&#xff0c;它在异步复制的基础上增加了一定程度的同步性&#xff0c;旨在提高数据安全性&#xff0c;减少数据丢失的风险。 半同步主从复制…

自动缩放 win7 远程桌面

https://mremoteng.org/download 用这个软件&#xff0c;下载 zip 版&#xff0c;不需要管理员权限 在这里找到的&#xff0c;选票最高的一个就是 https://superuser.com/questions/1030041/remote-desktop-zoom-and-full-screen-how-win10-remote-win7-2008-2003-ho

超越YOLO! RT-DETR 实时目标检测技术介绍

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

数据结构+算法-实现一个计算器

在学习栈的数据结构的时候讲到可以用栈来实现一个计算器的功能&#xff0c;那么这个功能是如何实现的呢&#xff1f; 采用栈模拟得方式来实现一个计算器 要实现如下的功能: 字符串如何转为整数 2.处理加减法 如何处理加减法呢&#xff1f; 5-128 给第一个数字前面放一个号…