进程环境详解(四)---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函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: V3S拍照上传又拍云bug排查过程
- 下一篇: linux mktime函数会受当前环境