在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函数详解相关推荐

  1. 配置环境变量的方法:putenv和setenv函数区别

    ​日常中我们经常会在linux环境上配置环境变量,那么linux上配置环境变量的方法有哪些呢? 1.直接用export命令: eg:​ export PATH=$PATH:/opt/build_too ...

  2. Skynet中环境变量的 skynet.getenv 和 skynet.setenv 的实现

    skynet中服务器启动需要使用config配置,这其中设计到了环境变量的设置 和 环境变量的值的获取 skynet.setenv 和 skynet.send 源码 在skynet.lua 中的代码 ...

  3. linux内核中的hook函数详解,linux内核中的hook函数详解

    在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...

  4. python def函数报错详解_JSer 快速入门 Python 之函数详解

    前一篇文章,用一天的时间,通过与 JavaScript 做对比的方式,快速领略了 Python 全貌. 梳理了那么多,若忽略细节差异,两门语言只有两个重要差异: 1.书写风格上大相同 2.功能覆盖上, ...

  5. python内置函数详解总结篇_Python内置函数详解——总结篇

    数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作(8个) 变量操作(2个) 交互操作(2个) 文件操作(1个) 编译执行(4个) 装饰器(3个) 数学运算 abs:求 ...

  6. python100个内置函数详解_Python 63个内置函数详解

    Python 内置函数最全汇总: 1 abs() 绝对值或复数的模 In [1]: abs(-6) Out[1]: 6 2 all() 接受一个迭代器,如果迭代器的所有元素都为真,那么返回True,否 ...

  7. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  8. 2通过程序获得环境变量,getenv(),setenv()函数和unsetenv()函数,env查看环境变量,echo输出指定的环境变量

     1进程环境 libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明.例如: 运行结果: 2.env命令可以查看进程信息 3. ...

  9. java程序如何解代数方程_基于代数方程库Algebra.js解二元一次方程功能示例

    本文实例讲述了基于代数方程库Algebra.js解二元一次方程功能.分享给大家供大家参考,具体如下: 假设二元一次方程如下: x + y = 11 x - y = 5 解方程如下: 测试algebra ...

最新文章

  1. Expandable Table的Demo
  2. 用户 ‘IIS APPPOOL\IdealTest‘ 登录失败解决方案
  3. 记一次接收微信公众平台推送消息的实例
  4. python与php8-Python比php发展快的十大理由
  5. 那些年我们薅(撸)过的电子羊毛(设备)
  6. salero网店的官方邮箱设置
  7. C++11中的右值引用及move语义编程
  8. MacOS 的 zsh 和 bash 切换
  9. java mariadb 使用,java连接mariaDB的设置,java连接mariadb
  10. 电商项目实战项目需求以及技术选型
  11. Outlook 邮箱备份操作手册
  12. Linux基础命令---显示文本grep
  13. 将Matplotlib嵌入wxPython的GUI界面中
  14. java layer调用native层的android_media_AudioTrack_get_min_buff_size()确定audio track buffer的min size...
  15. YUI-compressor 在Linux下安装和使用
  16. IDM安装及使用方法快速入门
  17. 基于金笛短信Web中间件实现Cacti短信报警
  18. linux下LTP工具说明
  19. Unity开发VR项目(四)—— 创建VR场景
  20. scala windows搭建开发环境

热门文章

  1. 让 CPU 告诉你硬盘和网络到底有多慢
  2. 中国SaaS死或生之一:“网红”CRM的大起大落
  3. Hiredis库的简单使用
  4. 马哥linux2020博客,马哥linux学习(bash shell学习)
  5. php fstat,PHP函数fstat介绍
  6. 民生银行 IT运维故障管理 可视化案例
  7. pitch android,Pitch Clash
  8. ML之LassoRRidgeR:基于datasets糖尿病数据集利用LassoR和RidgeR算法(alpha调参)进行(9→1)回归预测
  9. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——41~66
  10. ML之NB、LoR:基于NB和LoR算法对Kaggle IMDB影评数据集(国外类似豆瓣电影)情感分析进行分类