首页 > 系统相关 >嵌入式Linux系统编程 — 7.2 进程的环境变量

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

时间:2024-07-07 16:55:53浏览次数:7  
标签:char 函数 argv 嵌入式 7.2 value Linux include 环境变量

目录

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;
}

运行结果如下: 



 

标签:char,函数,argv,嵌入式,7.2,value,Linux,include,环境变量
From: https://blog.csdn.net/qq_41921826/article/details/140193210

相关文章

  • Linux 基础命令实例教程
    Linux是一个强大的操作系统,掌握其基本命令对任何级别的用户来说都是至关重要的。本文将通过具体的实例来演示一些常用的Linux命令,帮助你更好地理解和运用它们。1.文件和目录操作例:列出当前目录下的所有文件和目录ls-la这会列出当前目录下所有文件和目录的详细信息......
  • 将Linux做成路由器
    将Linux做成一个路由器主机名IPoe01192.168.200.170(外网)192.168.100.164(内网)oe02192.168.100.162(内网)通过这个规划表,oe02这个主机是只有一个内网网卡的,无法上网,我们需要将oe01这个Linux做成一个路由器,也就是从内网网卡收到的流量转发到外网网卡,然后出去路......
  • Linux系统部署MongoDB开源文档型数据库并实现无公网IP远程访问
    个人名片......
  • Linux搭建DNS服务器实验
    一、实验目的及要求  实验目的◼理解DNS协议◼掌握Linux环境下DNS服务器的配置方法实验要求◼设置域名***.com(***为名字缩写)◼搭建dns服务器,实现域内三台服务器的正向和反向解析web.***.com192.168.x.11ftp.***.com192.168.x.12bbs.***.com192.168.x.13去......
  • Linux启动&重启jar脚本
    启动&重启jar#!/bin/bash#设置颜色代码\033、\e和\E是等价的RED='\033[0;31m' #红色 GBLUE='\033[0;36m' # GREEN='\033[0;32m' #绿色PURPLE='\033[0;35m'#紫色PINK='\E[0;35m' #粉红YELOW='\E[0;33m......
  • 在linux服务器上平滑发布(蓝绿发布)java项目,不影响现有业务运行
    具体操作使用nginx作为负载均衡,配置upstream(注意修改项目名)upstream项目名{serverlocalhost:7008max_fails=3fail_timeout=30s;serverlocalhost:7009max_fails=3fail_timeout=30s;}启动命令(注意修改jar位置及端口号),后修改为start.sh并......
  • Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)
       ......
  • FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
    ​《FFmpeg开发实战:从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能实在是太简单了,无法应用于真实直播的生产环境,真正能用于生产环境的流媒体服务器还要看SRS或者ZLMediaKit。SRS是一......
  • 基于Linux的可信文件系统设计与实现(开题报告)
    本科毕业设计(论文)开题报告题目:基于Linux的可信文件系统设计与实现1、毕业设计的主要内容、重点和难点等1.主要内容:在操作系统中实现文件的各种操作,即新建、复制、删除等。使用加密算法对重要文件进行加密,保证文件的安全性,设置用户登录进入系统后才能操作文件,对用户密码......
  • 基于Linux的可信文件系统设计与实现
    目录摘要IAbstractII第1章绪论11.1选题背景及意义11.1.1选题背景11.1.2选题意义11.2国内外研究现状及发展趋势21.2.1国内研究现状21.2.2国外研究现状21.2.3发展趋势21.3论文研究主要内容3第2章技术及工具概述42.1Linux文件系统概述4......