进程环境---getenv、putenv和setenv函数详解

2024-06-07 22:48

本文主要是介绍进程环境---getenv、putenv和setenv函数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 在Linux中的c程序的典型内存分布中,之前提到的有 text段、data段、bss段、堆和栈这几部分,在笔记“麦子学院c语言->典型c语言程序的c内存分布”中介绍了。但是其实一个c语言进程的内存分布中不止是有这些区域,还有命令行参数、环境变量以及共享库和mmap映射区等区域。如下图所示
------------------------------
环境变量区域
命令行参数
共享库和mmap映射区
bss段
data段
text段
-------------------------------
=====================================================
通常环境变量是通过 name=value 的形式给出的,使用 environ 指针打印出的所有的环境变量的形式就是如此。使用 getenv 函数可以通过给出 name 来获得 value 的值。
函数原型:
函数参数:
  • name:想要获取的环境变量名
返回值:
  • 调用成功返回指向 value 的指针
  • 调用失败返回 NULL
=====================================================
putenv 函数用来向环境表中 添加或者修改 环境变量。
函数原型:
函数参数:
  • string:指向环境变量的指针,其中环境变量必须以 "name=value" 的形式给出
返回值:
  • 调用成功返回 0
  • 调用失败时返回 非0 值
如果环境表中没有 name 这个环境变量,则添加该环境变量;如果环境表中已经有了name这个环境变量,则先删除之前的 value,再修改为新的 value。
=====================================================
setenv 函数和putenv 函数功能类似,可以用来 添加或修改 环境变量。
函数原型:
函数参数:
  • name:环境变量名
  • value:环境变量值
  • overwrite:重写选项,当 name 在环境表中存在时,如果 overwrite 的值为 0 ,则不修改name的值;如果 overwrite 的值为 非0,则修改name的值。
返回值:
  • 调用成功返回 0
  • 调用失败时返回 非0
=====================================================
putenv 函数和 setenv 函数虽然功能类似,但是这两个函数在实现方面还是有区别的,区别如下:
putenv函数:
  • putenv 函数会将参数 string 直接填写到环境表中,不会再为 "name=value" 这个字符串再去分配内存。如果是在一个函数中定义的string,那么在调用该函数后,string 指向的内容可能会被释放,就找不到name环境变量的值了。
setenv 函数:
  • setenv 函数和 putenv 函数不同,它会将name和value指向的内容复制一份并为其分配内存,形成 "name=value" 的字符串,并将其地址写入到环境表中。所以就不会出现上面putenv 的情况,就算函数返回了,name 和 value指向的内容被释放了,仍然有一份拷贝在。

这篇关于进程环境---getenv、putenv和setenv函数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040524

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、