欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C语言】【unix c】环境变量(续)

程序员文章站 2023-12-21 22:27:52
...
一、环境变量
    bash下的环境变量
    每个进程都默认从父进程继承环境变量
    bash本身就是一个程序,这个程序运行的时候,是bash进程
    可以定义只能在自己的这个进程中使用的变量,称之为自定义变量
    用户可以使用【export 环境变量名字】 将自定义变量变为环境变量,环境变量可以被子进程继承

    如何使用程序访问环境变量:

        系统维护着一个全局变量(extern char **environ;)这个全局变量的名字就是环境变量列表的首地址 ????? //**environ也就是指针数组和*argv[]其实一样,只是前者是变量,后者是常量
        借用这个全局变量,遍历环境变量列表(trav_l.c)
            [email protected]:~/day/day31$ cat trav_l.c 
            #include <stdio.h>
            extern char **environ; //这里作用仅是扩充作用域
            int main(void) {
                while(*environ != NULL) {
                printf("%s\n", *environ);
                environ++;
                }
                return 0;
            }


    C语言的完整开头:
        int main(int argc, char *argv[], char *envp[])//第三个参数可以改变环境变量
            只用这种方式来遍历环境变量的列表(trav_l1.c)
                #include <stdio.h>

                int main(int argc, char *argv[], char *envp[]) {
                    int i = 0;
                    for(; envp[i] != NULL; i++)
                    printf("%s\n", envp[i]);
                    return 0;
                }
                [email protected]:~/day/day31$ a.out 
                SSH_AGENT_PID=1875
                GPG_AGENT_INFO=/tmp/keyring-RH8OwI/gpg:0:1
                TERM=xterm
                SHELL=/bin/bash
                XDG_SESSION_COOKIE=d3194bb0b9dac9419f2d00d200000009-1502412776.464108-1366998638
                WINDOWID=60820196
                OLDPWD=/home/tarena
                ...

    几个操作环境变量的函数
        getenv(3)

            #include <stdlib.h>
                char *getenv(const char *name);
                功能:找到名字为name的环境变量,返回一个指针(该字符串值的首地址)(即获取环境变量的值)
                参数:
                    name:指定了环境变量的名字
                返回值: NULL 找不到匹配的
                    找到了就返回环境变量值字符串的首地址
            举例:环境变量的操作(env_op.c)

                #include <stdio.h>
                #include <stdlib.h>

                int main(void) {
                    printf("%s\n", getenv("name"));
                    return 0;
                }

                [email protected]:~/day/day31$ a.out 
                Beijing
            注意:环境中得有name变量才可以,否则是段错误(返回NULL)

        putenv(3)

            #include <stdlib.h>
            int putenv(char *string);

                功能:增加或改变环境变量的值
                参数:
                    string:必须遵循name=value格式,如果name不存在,增加环境变量列表,如果存在,改变环境变量的值为value
                返回值:成功 0
                    失败 非0
            举例:接上例
                #include <stdio.h>
                #include <stdlib.h>

                int main(void) {
                    putenv("CHINA=beijing");
                    printf("%s\n", getenv("CHINA"));
                    return 0;
                }

                [email protected]:~/day/day31$ a.out 
                beijing

                [email protected]:~/day/day31$ env|grep CHINA
                没有值
            但是: 在env中察看变量是查不到的
            原因: a.out是bash子进程,在子进程里添加了环境变量,但是父进程是无法继承子进程的环境变量的,程序执行结束后用env察看环境变量时是在bash进程下,所以没有

        setenv(3)

            #include <stdlib.h>
            int setenv(const char *name, const char *value, int overwrite);
            功能:增加或改变一个环境变量
            参数:
                name:指定环境变量的名字
                value:指定环境变量的值
                overwrite:如果环境变量存在,overwrite设置为非0的情况下,改变环境变量的值为value
                                 如果overwrite设置为0,环境变量的值不改变
            返回值:0 成功
                -1 错误 errno被设置

            int unsetenv(const char *name);
            功能:删除环境变量
            参数:
                name:指定要删除的环境变量
            返回值:0 成功
                -1 错误 errno被设置
            举例:
                #include <stdio.h>
                #include <stdlib.h>

                int main(void) {
                    printf("%s\n", getenv("name"));
                    putenv("CHINA=beijing");
                    printf("before...%s\n", getenv("CHINA"));
                    setenv("CHINA", "Nanjing", 1);
                    printf("after...%s\n", getenv("CHINA"));
                    unsetenv("name");
                    printf("%s\n", getenv("name"));
                    return 0;
                }

            overwrite=0:
                [email protected]:~/day/day31$ a.out 
                Beijing
                before...beijing
                after...beijing //如果overwrite设置为0,环境变量的值不改变
                段错误 (核心已转储)   //删除后变量没有了,指向NULL,产生段错误

            overwrite=1:
                [email protected]:~/day/day31$ a.out 
                Beijing
                before...beijing
                after...Nanjing //为非0的情况下,改变环境变量的值为value
                段错误 (核心已转储)


        clearenv(3#include <stdlib.h>
            int clearenv(void);
            功能:清楚环境变量
            参数:无
            返回值:0 成功
                非0 失败

上一篇:

下一篇: