• 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
    ");
        } else {
            printf("PATH=%s
    ", envVal);
        }
        if (setenv("myenv", "li enhua", 0) == -1) {
            printf("setenv error
    ");
         } else {
            myenv = getenv("myenv");
            printf("myenv=%s
    ", myenv);
        }
        if (putenv("myenv1=haha") != 0) {
             printf("putenv error
    ");
        } else {
             myenv = getenv("myenv1");
             printf("myenv1=%s
    ", 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)


  • 相关阅读:
    WHAT I WANT TO DO ?
    BACK找工作感悟
    C++基础六-结构体
    C++基础五-指针
    C++基础四-函数
    C++基础三-数组

    C++基础三-循环控制
    C++基础二-条件判断
    PHP 基础
  • 原文地址:https://www.cnblogs.com/lienhua34/p/4005367.html
Copyright © 2020-2023  润新知