UNIX環境編程學習筆記(16)——進程管理之進程環境變量


lienhua34
2014-10-03

1 環境表和環境指針

在每個進程啟動時,都會接到一張環境表。環境表是一個字符指針數組,其中每個指針包含一個以 null 結束的 C 字符串的地址。全局變量environ 則包含了該指針數組的地址,

extern char **environ;

例如,圖 1 顯示了包含有 5 個環境字符串的環境表,

圖 1: 含有 5 個環境字符串的環境表

2 環境變量

環境字符串的形式通常為,name=value。

ISO C 定義了一個函數 getenv,用於獲取環境變量值。

#include <stdlib.h>

char *getenv(const char *name);

返回值:指向與name關聯的value的指針,若為找到則返回NULL

POSIX.1 定義了兩個函數 putenv 和 setenv,用於設置環境變量,

#include <stdlib.h>

int putenv(char *str);

返回值:若成功則返回0,若出錯則返回非0值

putenv 的參數是形式為 name=value 的字符串的指針,將參數放到環境表中。如果 name 已經存在,則先刪除其原有的定義。

#include <stdlib.h>

int setenv(const char *name, const char *value, int rewrite);

返回值:若成功則返回0,若出錯則返回-1

setenv 函數將環境變量 name 的值設置為 value。如果環境表中 name 已存在,那么

• 若 rewrite 為非 0 值,則首先刪除其現有定義。

• 若 rewrite 為 0,則不刪除其現有定義,name 不設置為新的 value,也不出錯。

另外提供了 unsetenv 函數用於刪除環境變量,

#include <stdlib.h>

int unsetenv(const char *name);

返回值:若成功則返回0,若出錯則返回-1

unsetenv 函數刪除 name 的定義,即使不存在環境變量 name 也不出錯。

例子:

#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
    char *envVal;
    char *myenv;
    if ((envVal = getenv("PATH")) == NULL) {
        printf("not environment variable PATH\n");
    } else {
        printf("PATH=%s\n", envVal);
    }
    if (setenv("myenv", "li enhua", 0) == -1) {
        printf("setenv error\n");
     } else {
        myenv = getenv("myenv");
        printf("myenv=%s\n", myenv);
    }
    if (putenv("myenv1=haha") != 0) {
         printf("putenv error\n");
    } else {
         myenv = getenv("myenv1");
         printf("myenv1=%s\n", myenv);
    }
    exit(0);
}

編譯該程序,生成文件 envdemo,然后運行該文件,

lienhua34:demo$ gcc -o envdemo envdemo.c
lienhua34:demo$ ./envdemo
PATH=/usr/local/texlive/2013/bin/i386-linux:/usr/local/texlive/2013/bin/i386-linux:/
myenv=li enhua
myenv1=haha

(done)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM