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 為 ...