环境表

每个程序都接收一张环境表。与参数表一样,环境表是一个字符指针数组,其中每个指针包含一个以NULL结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:

#include < unistd.h >
extern char **environ;

环境表

注意:

  1. 父进程在创建子进程时会复制一份环境变量给子进程,即父进程环境表可被子进程继承,但此后两者的环境变量互不影响。

  2. 进程运行起来之后修改环境变量只能影响自己。

  3. 相关函数:getenv/putenv/setenv/unsetenv

    putenv 与 setenv的区别
    putenv 函数会将参数 string 直接填写到环境表中,不会再为 “name=value” 这个字符串再去分配内存。如果是在一个函数中定义的string,那么在调用该函数后,string 指向的内容可能会被释放,就找不到name环境变量的值了。
    setenv 函数和 putenv 函数不同,它会将name和value指向的内容复制一份并为其分配内存,形成 “name=value” 的字符串,并将其地址写入到环境表中。所以就不会出现上面putenv 的情况,就算函数返回了,name 和 value指向的内容被释放了,仍然有一份拷贝在。

打印进程环境表

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

或者:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {

    extern char **environ;
    int i =0;
    for(; environ[i] != NULL; i++) {
        printf("%s\n", environ[i]);
    }
    return 0;
}

mac下运行结果:

bogon:process xqhero$ ./env
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
SHELL=/bin/bash
TMPDIR=/var/folders/p9/799g2gsx6lb27w_bfm0krkhw0000gn/T/
TERM_PROGRAM_VERSION=433
OLDPWD=/Users/xqhero/shell/linux-shell/c
TERM_SESSION_ID=069A54AF-0B0D-4044-9D3A-3D0D50CF3EB5
USER=xqhero
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.EOlD40jI2O/Listeners
PATH=/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/opt/php@7.2/sbin:/usr/local/opt/php@7.2/bin:/Users/xqhero/go/bin:/Users/xqhero/.composer/vendor/bin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
PWD=/Users/xqhero/shell/linux-shell/c/process
LANG=zh_CN.UTF-8
XPC_FLAGS=0x0
ITERM_ORIG_PS1=\h:\W \u\$ 
PS1=\h:\W \u\$ 
XPC_SERVICE_NAME=0
HOME=/Users/xqhero
SHLVL=1
ITERM_PREV_PS1=\[\]\h:\W \u\$ \[\]
LOGNAME=xqhero
GOPATH=/Users/xqhero/go
_=./env
文档更新时间: 2021-03-03 21:10   作者:周国强