【问题标题】:List environment variables with C in UNIX在 UNIX 中使用 C 列出环境变量
【发布时间】:2010-08-13 03:27:24
【问题描述】:

有没有办法使用 C 枚举环境变量和检索值?

【问题讨论】:

    标签: c unix environment-variables


    【解决方案1】:

    看看environ 全局变量。

    extern char **environ;
    

    它可能在unistd.h 中定义(查看上面的environ (5) 手册页)。

    这是我写的一个小代码演示:

    #include <stdio.h>
    extern char **environ;
    
    int main()
    {
        for (char **env = environ; *env; ++env)
            printf("%s\n", *env);
    }
    

    使用方法如下:

    matt@stanley:~/Desktop$ make enumenv CFLAGS=-std=c99
    cc -std=c99    enumenv.c   -o enumenv
    matt@stanley:~/Desktop$ ./enumenv 
    ORBIT_SOCKETDIR=/tmp/orbit-matt
    SSH_AGENT_PID=1474
    TERM=xterm
    SHELL=/bin/bash
    ... (so forth)
    

    【讨论】:

    • unistd.h 中没有定义,或者如果是,您的系统不符合 POSIX。如果你想使用 POSIX,你需要显式声明 extern char **environ;
    • @R,+1。至少在我的系统上,如果设置了__USE_GNU,它只会在unistd.h 中声明,这表明它是一个扩展。 (FWIW,__environ,也是一个扩展,被无条件声明)。
    • @R..:在 POSIX 2008 标准之前,您是正确的;从那时起,&lt;unistd.h&gt; 采取了明智的措施来要求它。它是唯一没有在系统头文件中声明的变量。我所知道的唯一奇怪的东西是union semun
    • 道歉;我站得更正了。我已经详细阅读了 POSIX 的早期版本,但还没有阅读 POSIX 2008。
    • @Jonathan,不知道这个semun 的事情。吓人。
    【解决方案2】:

    环境信息可以作为额外参数传递给main。我不知道它是否合规,但它确实有效(在 Ubuntu 上测试)。只需定义额外的参数及其由 NULL 指针终止的 char 指针数组。以下将打印出批次。

    #include <stdio>
    
    int main(int argc, char *argv[], char *envp[])
    {
      int index = 0;
      while (envp[index])
        printf("%s\n", envp[index++];
    }
    

    【讨论】:

    • 实际上,这适用于大多数 unice,但 POSIX 并未指定。使用extern char **environ;
    • 乔纳森回应了我的其他 cmets 之一,截至 POSIX 2008,它现在 unistd.h 的一部分。
    • while (*envp) printf("%s\n", *envp++);保存索引变量。
    • 我只是无意中读到了 argv 的末尾才发现这一点。显然,即使您在源代码中没有该参数,它也存在。
    【解决方案3】:

    《Linux 编程接口》一书第 127 页有一个演示。

    示例 6-3:显示进程环境 –––––––––––––––––––––––––––––––––––––––––––––––––––––––proc / display_env.c

    #include "tlpi_hdr.h"
    
    extern char **environ;
    
    int
    main(int argc, char *argv[])
    {
        char **ep;
        for (ep = environ; *ep != NULL; ep++)
            puts(*ep);
        exit(EXIT_SUCCESS);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多