Linux系统编程(环境变量编程)

news2024/10/7 8:30:08

文章目录

  • 前言
  • 一、环境变量表
  • 二、环境变量读写接口
  • 总结


前言

本篇文章我们来讲解环境变量编程,环境变量在Linux中可以说是非常重要的,那么这篇文章将会带大家来学习环境变量的编程。

一、环境变量表

在Linux系统中,环境变量是一种特殊的变量,用于存储操作系统或用户定义的信息,可以在系统运行过程中被各种程序和脚本访问和使用。环境变量表是一个存储环境变量的数据结构,Linux系统将它作为一个数组进行管理。

环境变量表是由操作系统在程序执行之前设置和维护的。当一个新的进程被创建时,它会继承其父进程的环境变量表。环境变量表中的每个变量都由一个键值对表示,其中键是变量名,值是变量的内容。

在Linux系统中,可以使用一些命令和函数来访问和操作环境变量表,例如:

printenv 命令:用于显示当前环境变量表中所有的环境变量及其值。
export 命令:用于设置和修改环境变量的值。
getenv 函数:在编程中使用,用于获取指定环境变量的值。
setenv 函数:在编程中使用,用于设置或修改环境变量的值。
unset 命令:用于删除指定的环境变量。

环境变量表在Linux系统中具有广泛的应用。一些常见的环境变量包括:

PATH:用于指定可执行程序的搜索路径。
HOME:当前用户的家目录路径。
USER:当前登录用户的用户名。
LANG:用于设置程序的本地化语言环境。
LD_LIBRARY_PATH:用于指定共享库的搜索路径。

通过使用环境变量,可以为程序提供配置信息、设置系统行为以及定义一些常用的路径和参数等。在编写脚本或开发应用程序时,理解和正确使用环境变量可以提高程序的可配置性和灵活性。

编写代码打印环境变量表:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char** argv, char** envp)
{
    int i = 0;
    extern char** environ;

    while(environ[i])
    {
        printf("%s\n", environ[i]);
        i++;
    }

    return 0;
}

运行结果:

在这里插入图片描述

二、环境变量读写接口

在Linux系统中,可以使用一些函数来读取和写入环境变量的值。下面是一些常用的环境变量读写接口函数的讲解:

getenv(const char *name)

这个函数用于获取指定环境变量的值。它接受一个字符串参数name,表示要获取的环境变量的名称,并返回该环境变量的值作为字符串。如果指定的环境变量不存在,则返回NULL。

示例代码:

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

int main() {
    char *path = getenv("PATH");
    if (path != NULL) {
        printf("PATH: %s\n", path);
    } else {
        printf("PATH environment variable not found.\n");
    }

    return 0;
}

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

这个函数用于设置或修改环境变量的值。它接受三个参数,name表示要设置或修改的环境变量的名称,value表示要设置的值,overwrite表示是否覆盖已存在的环境变量,如果overwrite为非零值,则会覆盖已存在的环境变量,如果为零,则不会进行覆盖。

示例代码:

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

int main() {
    // 设置环境变量
    setenv("MY_VAR", "Hello world!", 1);

    // 获取环境变量并打印
    char *myVar = getenv("MY_VAR");
    if (myVar != NULL) {
        printf("MY_VAR: %s\n", myVar);
    } else {
        printf("MY_VAR environment variable not found.\n");
    }

    return 0;
}

unsetenv(const char *name)

这个函数用于删除指定的环境变量。它接受一个字符串参数name,表示要删除的环境变量的名称。如果指定的环境变量存在,则将其从环境变量表中删除;如果不存在,则不会产生任何效果。

示例代码:

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

int main() {
    // 删除环境变量
    unsetenv("MY_VAR");

    // 获取环境变量并打印
    char *myVar = getenv("MY_VAR");
    if (myVar != NULL) {
        printf("MY_VAR: %s\n", myVar);
    } else {
        printf("MY_VAR environment variable not found.\n");
    }

    return 0;
}

int putenv(char *string);

string 是一个指向以 “name=value” 格式表示的字符串的指针。该字符串指定了要设置的环境变量的名称和值。
函数的工作原理如下:

如果传递给 putenv 的字符串包含 “name=value” 类似的格式,它将尝试将此字符串添加到环境变量中。如果指定的环境变量名称已经存在,那么该环境变量的值将被更新为新的值。

如果传递给 putenv 的字符串为空或无效,或者在设置环境变量时出现了错误,该函数将返回一个非零值来指示失败。

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

int main() {
    char* env_var = "MYVAR=Hello";  // 设置环境变量 MYVAR
    int result = putenv(env_var);
    if (result != 0) {
        printf("Failed to set environment variable!\n");
        return 1;
    }
    
    char* value = getenv("MYVAR");  // 获取环境变量 MYVAR 的值
    if (value != NULL) {
        printf("MYVAR: %s\n", value);
    }
    
    return 0;
}

在上面的示例中,putenv 函数被用来设置一个名为 “MYVAR” 的环境变量,并将其值设置为 “Hello”。然后,使用 getenv 函数获取并打印了环境变量 “MYVAR” 的值。

需要注意的是,使用 putenv 函数设置的环境变量的内存由系统管理。如果在环境变量的值发生更改后尝试访问该变量,应注意确保不会访问到悬空的指针或已被释放的内存。如果需要更灵活地管理环境变量,可以考虑使用 setenv 和 unsetenv 函数来代替 putenv 函数。

这些函数在C语言编程中非常常用,可以方便地读取、设置和删除环境变量的值。通过使用这些函数,可以在程序中灵活地操作环境变量,实现程序的配置和自定义。

总结

本篇文章就讲解到这里,环境变量对于进程来说是非常重要的一个部分。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL-每日一题【595.大的国家】

题目 World 表&#xff1a; 如果一个国家满足下述两个条件之一&#xff0c;则认为该国是 大国 &#xff1a; 面积至少为 300 万平方公里&#xff08;即&#xff0c;3000000 km2&#xff09;&#xff0c;或者人口至少为 2500 万&#xff08;即 25000000&#xff09; 编写一个…

kafka第一课-Kafka快速实战以及基本原理详解

一、Kafka介绍 Kafka是一个分布式的发布-订阅消息系统&#xff0c;可以快速地处理高吞吐量的数据流&#xff0c;并将数据实时地分发到多个消费者中。Kafka消息系统由多个broker&#xff08;服务器&#xff09;组成&#xff0c;这些broker可以在多个数据中心之间分布式部署&…

react学习笔记——复习模块

前言&#xff1a;最近开始学习react&#xff0c;之前学习vue没有把笔记整理的特别好&#xff0c;非常后悔&#xff0c;感觉学了等于没学&#xff0c;这次要好好整理啊&#xff01;本次学习参考教程为B站&#xff0c;张天禹老师的react全家桶。 文章目录 类的基本知识创建一个类…

时间序列分类 论文和数据集汇总

时间序列分类 时间序列广泛应用于金融、工业领域、健康、运维、交通领域。 其实异常检测任务也可以看作是一个时间序列分类任务&#xff0c;异常与否两类&#xff0c;或者异常有很多种&#xff0c;则是多分类问题。 时间序列分类的数据是多种的&#xff1a;时间轨迹数据&#x…

Real-time Short Video Recommendation on Mobile Devices 阅读笔记

摘要 用户会实时兴趣转移&#xff0c;为实现在客户端重排&#xff0c;提出一种 context-aware re-ranking 方法&#xff0c;基于 adaptive beam search 1 引言 1.1 之前架构的问题&#xff1a; 1&#xff0c;需解决 real-time feedback 的问题 2&#xff0c;速度问题 1.2…

【Spring Boot】开发环境热部署

开发环境热部署 在实际的项目开发调试过程中会频繁地修改后台类文件&#xff0c;导致需要重新编译、重新启动&#xff0c;整个过程非常麻烦&#xff0c;影响开发效率。下面介绍Spring Boot如何解决这个问题。 1.devtools实现原理 我们在开发调试Spring Boot项目时&#xff0…

Flink 系列三 Flink 实战

目录 ​编辑 前言 1、安装flink环境 2、在idea中创建flink的第一个demo 2.1、执行如下maven命令 2.2、填写groupId、artifactId、version、package 2.3、选择Yes即可生成创建好的工程 3、开发第一个flink程序 3.1、开发一个简单的统计程序 3.2、直接编译得到jar包 4、…

【Java基础】AQS (AbstractQueuedSynchronizer) 抽象队列同步器

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读1.1 CLH锁 二、概览三、使用场景3.1 AQS 对资源的共享方式…

【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)

写在前面&#xff1a;今天又学习一点新的东西&#xff0c;方面日后查询和巩固学习&#xff0c;下面将学习过程记录下来。 一、创建MAVEN工程 1. 打开IDEA创建一个纯净的maven工程项目 2. 打开pom文件&#xff0c;导入maven坐标 注意&#xff1a;我使用的postgres数据库&#x…

【微服务】搭建项目以及子模块

目录 方法一&#xff1a;搭建远程仓库新建idea 项目创建子模块创建父模块的pom父模块的gitignore文件修改查看远程代码仓库 方法二 方法一&#xff1a; 搭建远程仓库 选择 下载地址 新建idea 项目 复制 项目远程仓库的下载地址 下载完成 创建子模块 导入微服务的必要组件…

Apache Pulsar 分布式部署

1.Pulsar 简介 Pulsar 是一个支持多租户的、高性能的消息中间件&#xff1b;最初是由 Yahoo 研发的开源&#xff0c;分布式pub-sub系统&#xff0c;现在是Apache的一个顶级开源项目 Pulsar 提供了四种订阅类型&#xff0c;它们可以共存在同一个主题上&#xff0c;以订阅名进行区…

【html页面引入vue3语法模板】在html页面中使用vue3语法和elementul-plus组件库的简单模板

前言 这是最近在看这些东西&#xff0c;因为看别的地方是用脚手架直接用的。 我这个项目想要在html上直接使用。 所以我就试了下如何在html上使用vue3语法 目前摸索出来的是这样可以使用。 记录下来供参考&#xff0c;如果有不好的地方后续改进 效果图 这里就是简单的试了一…

修改npm路径

npm config ls如果是第一次使用NPM安装包的话&#xff0c;在配置中只会看到prefix的选项&#xff0c;就是NPM默认的全局安装目录。但是如果有多次使用NPM安装包的话&#xff0c;就会看到cache和prefix两个路径。 新建两个文件夹node_global_modules和node_cache npm config s…

mac android studio设置跟mac系统一样的快捷键

mac版的android studio 跟mac系统的快捷键不一样,主要修改了下面几组操作,为了跟mac系统快捷键相同 setting->Keymap 搜索bottom 修改3个快捷键: cmd↓ 设置让鼠标移动到屏幕最后面 shiftcmd↓ 选中从当前位置到屏幕最下面 option↓. 或者 end 滚动到屏幕最下方 // 因为默认…

详解 HTTPS、TLS、SSL、HTTP区别和关系

一、什么是HTTPS、TLS、SSL HTTPS&#xff0c;也称作HTTP over TLS。TLS的前身是SSL&#xff0c;TLS 1.0通常被标示为SSL 3.1&#xff0c;TLS 1.1为SSL 3.2&#xff0c;TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。 二、HTTP和HTTPS协议的区别 …

【开源项目】中后台开发框架vue-next-admin

vue-next-admin 基本介绍 基于 vue3.x CompositionAPI setup 语法糖 typescript vite element plus vue-router-next pinia 技术&#xff0c;适配手机、平板、pc 的后台开源免费模板&#xff0c;希望减少工作量&#xff0c;帮助大家实现快速开发。 在线预览 账号: adm…

Braindecode系列 (1):在BCIC IV 2a数据集上进行试验

Braindecode系列&#xff1a;在BCIC IV 2a数据集上进行试验 0. 引言1. 环境介绍1.1 环境配置1.2 运行环境 2. Python实现2.1 加载和预处理数据集2.2 创建模型2.3 模型训练2.4 结果输出图像 3. 结果展示4. 总结 0. 引言 最近在看运动想象相关的论文时&#xff0c;找到了一个很好…

在线培训系统的保障措施带来安全、可靠的学习环境

在今天的数字时代&#xff0c;越来越多的人选择在线培训系统作为学习的方式。然而&#xff0c;随着在线教育市场的不断增长&#xff0c;安全和可靠性成为消费者普遍关心的问题。因此&#xff0c;在线培训系统需要采取一系列保护措施以确保学生的数据和隐私得到保护&#xff0c;…

Python 运算符(二)

文章目录 Python逻辑运算符Python成员运算符Python身份运算符Python运算符优先级后记 Python逻辑运算符 Python语言支持逻辑运算符&#xff0c;以下假设变量 a 为 10, b为 20: 运算符逻辑表达式描述实例andx and y 布尔"与" - 如果 x 为 False&#xff0c;x and y …

php周练

前言&#xff1a;博主个人小练&#xff08;纯小白&#xff09;。 目录 1.[SWPUCTF 2021 新生赛]gift_F12已解决2.[SWPUCTF 2021 新生赛]jicao3.[ZJCTF 2019]NiZhuanSiWei4.[SWPUCTF 2021 新生赛]no_wakeup5.[SWPUCTF 2021 新生赛]ez_unserialize 1.[SWPUCTF 2021 新生赛]gift_…