Wednesday, January 16, 2013

get environment in C

一切都是從這篇有趣的 C-faq 開始

http://c-faq.com/ansi/envp.html

有人問了 main() 的 "the third argument" *env[] 是啥?

一般就會講到這個可怕的歷史

在一般的 Unix 底下,很多人會跟你說,可以用 *env[] 或是 extern const char **environ 去問到

甚至給出了這樣的 code ...


#include <stdio.h>
 
extern const char **environ;
 
int main(int argc, const char *argv[], const char *env[])
{
    int i;
    for (i = 0; env[i]; i++)
        printf("env %02d: %s\n", i, env[i]);
    printf("=========================================\n");
    
    for (i = 0; environ[i]; i++)
        printf("env %02d: %s\n", i, environ[i]);
    printf("=========================================\n");
    
    printf(env==environ? "They are same.\n": "They are different.\n");
    return 0;
}

/* 
Output:


env 00: TMPDIR=/tmp/p0rIMq
env 01: PATH=/usr/local/bin:/usr/bin:/bin
env 02: PWD=/home/oAdQev
env 03: LANG=en_US.UTF-8
env 04: HOME=/home/oAdQev
env 05: SHLVL=0
=========================================
env 00: TMPDIR=/tmp/p0rIMq
env 01: PATH=/usr/local/bin:/usr/bin:/bin
env 02: PWD=/home/oAdQev
env 03: LANG=en_US.UTF-8
env 04: HOME=/home/oAdQev
env 05: SHLVL=0
=========================================
They are same.
*/


去 man 一下 environ (7) 可以看到相關的歷史


根據標準,我們應該使用 getenv 來跟系統要環境變數

以下是 C11 Standard 的節錄:


請參考:
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.13.html#getenv
http://www.cplusplus.com/reference/cstdlib/getenv/


C++ 的 case 也類似,用 std::getenv()
http://en.cppreference.com/w/cpp/utility/program/getenv



更多說明可以看這篇棧溢出:

http://stackoverflow.com/questions/10321435/is-char-envp-as-a-third-argument-to-main-portable



No comments:

Post a Comment