C語言標準庫函式getenv的實現

2021-08-14 23:46:55 字數 2003 閱讀 7654

c語言標準庫函式getenv可獲取環境引數(根據引數名稱),

函式宣告:char* getenv(char*name);

extern char **environ

其實現如下:

---------------glibc-1.09.1/sysdeps/generic/getenv.c

[cpp]view plain

copy

/* return the value of the environment variable name.  */

char

*  defun(getenv, (name), register

const 

char

*name)    

其中全域性指標__environ指向環境引數串的指標陣列,通過迴圈匹配找到指定的引數名稱,獲取=後的引數值並返回其指標。

那麼__environ是在哪定義的呢?是在start.c中。

---------------glibc-1.09.1/sysdeps/unix/start.c

c程式鏈結時,這部分stub**會鏈結到在程式開始處,_start是c程式真正的入口,_start呼叫start1,

而start1在呼叫初始化**__libc_init後會呼叫main()。

從下面的**看出,為什麼main中末尾無需exit(),因為start1代勞了。至於堆疊中的argc,argv,envp

這些都是作業系統在呼叫系統呼叫execve執行程式時就安排好的,start1的形參可以去到這些程序引數和環境變數,

全域性指標environ則等於envp(指向環境引數指標陣列的指標)。

[cpp]view plain

copy

…………  

#define __environ   environ

…………  

static

void

start1();  

…………  

/* n.b.: it is important that this be the first function.

this file is the first thing in the text section.  */

void

defun_void(_start)  

…………  

/* argsused */

static

void

start1(arg_dummies argc, argp)  

decl_dummies  

intargc;  

char

*argp;    

正常的記憶體堆疊布局是這樣的

int argc 

char** argv(指標陣列,0結尾)

char** envp(指標陣列,0結尾)

string arg(順序排列的引數串陣列,每個引數串0結尾) 

string env(順序排列的環境引數串陣列,每個引數串0結尾) 

其中argv[0]指向arg[0],argv[1]指向arg[1],……。

正常情況 &argv[argc+1]=envp,但是如果環境引數沒有,那麼堆疊中就沒有envp指標陣列和env串陣列,那麼argv後就直接是

arg的引數串陣列了,此時堆疊布局如下:

int argc 

char** argv(指標陣列,0結尾)

string arg(順序排列的引數串陣列,每個引數串0結尾) 

所以有&argv[argc+1]=*argv (第乙個引數指標argv[0]是指向第乙個引數串的),這是上述**中

if ((char *) __environ == *argv)

/* the environment is empty.  make __environ

point at argv[argc], which is null.  */

--__environ;

的由來。

C語言標準庫函式總結

一.動態記憶體分配 1.malloc 原型 extern void malloc unsigned int num bytes 用法 include 功能 分配長度為num bytes位元組的記憶體塊 說明 如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。當記憶體不再使用時,應使用...

c語言 12 標準c庫函式

標準c庫函式 標準c庫函式,是由ansi組織定義的一系列標準函式,在各種平台,各個編譯器都支援。ansi 是 美國國家標準協會,於是linux和windows環境下編譯執行,結果一致 這個沒啥學的,會用就行,知道哪些庫可以實現哪些功能,多用幾次就記住了,最初認識的 stdio.h stdio 意思是...

庫函式 getcwd和getenv函式的用法

函式名稱 getcwd include char getcwd char buf,size t size 作用 把 當前目錄 的 絕對位址 儲存到 buf 中,buf 的大小為 size。如果 size太小無法儲存該位址,返回 null 並設定 errno 為 erange。可以採取令 buf 為 ...