Environment variables 为什么/proc文件系统中environ的内容与extern environ指向的内容不同? GeNVE()在我的C++ Apache/CGI中给了我一些奇怪的东西,然后我检查了EnnOn/Prc/${PIDYOF-THY-RunIngIn进程},它们不匹配,我认为它们应该匹配,我想知道什么是错误的/PROC,或者是GETEN()?

Environment variables 为什么/proc文件系统中environ的内容与extern environ指向的内容不同? GeNVE()在我的C++ Apache/CGI中给了我一些奇怪的东西,然后我检查了EnnOn/Prc/${PIDYOF-THY-RunIngIn进程},它们不匹配,我认为它们应该匹配,我想知道什么是错误的/PROC,或者是GETEN()?,environment-variables,environment,getenv,environ,Environment Variables,Environment,Getenv,Environ,是的,我找到了答案,如果在运行时更改了进程env,则答案不一样。 我找到了官方文件: 请注意开始时的初始环境 我们更改了环境,比如说,setenv(),这将反映在extern-environ,我们可以遍历以验证它,但是/proc/self/environ是静态的,在运行时不会受到影响。进程启动时,/proc/$pid/environ数据显示环境变量的状态。如果随后修改了环境变量(例如,通过putenv()),这将反映在getenv()的返回值中,而不是/proc/$pid/environ。通过在

是的,我找到了答案,如果在运行时更改了进程env,则答案不一样。
我找到了官方文件:

请注意开始时的初始环境 我们更改了环境,比如说,
setenv()
,这将反映在
extern-environ
,我们可以遍历以验证它,但是/proc/self/environ是静态的,在运行时不会受到影响。

进程启动时,/proc/$pid/environ数据显示环境变量的状态。如果随后修改了环境变量(例如,通过
putenv()
),这将反映在
getenv()
的返回值中,而不是/proc/$pid/environ。通过在一个终端中编译和运行以下程序,并在另一个终端中查看其proc/../environ,您可以看到这一点

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

int main() {
    putenv("HOME=WTF");
    char *home = getenv("HOME");
    printf("pid %d  HOME=%s\n", getpid(), home);
    sleep(300);
}
#包括
#包括
int main(){
putenv(“家庭=WTF”);
char*home=getenv(“home”);
printf(“pid%d HOME=%s\n”,getpid(),HOME);
睡眠(300);
}

另外,理论上,对环境的更新可以反映在/proc/$pid/environ中,但实际上我不知道有任何实现是这样的。

你期望得到什么输出?@Someprogrammerdude,我认为它们是相同的,A来自/proc/${pid}/environ,B来自extern environ,A和B,它们是相同的东西?我说的对吗?理论上,对环境的更新可以反映在/proc/$pid/environ中。-你是想说应该是吗?@workaylifecycle,不,我不是想说“应该是”。唯一可行的方法是进程进行系统调用,告诉操作系统环境块的新虚拟地址。这“可以”由libc函数完成,比如
setenv
,但我认为没有理由总是这样做。此外,没有任何东西会强制用户空间代码进行该系统调用。因此,即使libc函数这样做了,也不会阻止进程使用不进行必要系统调用的其他函数移动environ块。
#include<stdio.h>
extern char **environ;

void run()
{
    char* s = *environ;
    printf("declare -x  all env begin\n");    
    for (int i = 1; NULL != s; ++i) {
        printf("declare -x  %s\n", s);
        s = *(environ+i);
    }
    printf("declare -x  all env end\n");
}
declare -x  all env begin
declare -x  FCGI_ROLE=RESPONDER
declare -x  UNIQUE_ID=Wvq-Cn8AAAEAAAkmJlsAAAmM
declare -x  HTTP_HOST=www.example.com
declare -x  HTTP_X_CLIENT_PROTO=https
declare -x  HTTP_X_CLIENT_PROTO_VER=HTTP/1.1
declare -x  HTTP_X_REAL_IP=112.96.194.222
declare -x  HTTP_X_FORWARDED_FOR=112.96.194.222
declare -x  CONTENT_LENGTH=177
declare -x  HTTP_CHARSET=utf-8
declare -x  HTTP_ACCEPT_ENCODING=gzip
declare -x  HTTP_REFERER=https://serviceexample.com/exbb58374cdce267a6/91/page-frame.html
declare -x  CONTENT_TYPE=application/x-www-form-urlencoded
declare -x  HTTP_USER_AGENT=Mozilla/5.0 (Linux; Android 5.1; vivo X6Plus D Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044030 Mobile Safari/537.36 MicroMessenger/6.6.6.1300(0x26060637) NetType/4G Language/zh_CN MicroMessenger/6.6.6.1300(0x26060637) NetType/4G Language/zh_CN
declare -x  PATH=/usr/bin:/bin:/usr/sbin:/sbin
declare -x  SERVER_SIGNATURE=
declare -x  SERVER_SOFTWARE=Apache/2.2.19 (Unix) mod_ssl/2.2.19 OpenSSL/1.0.1t DAV/2 mod_fcgid/2.3.9
declare -x  SERVER_NAME=www.example.com
declare -x  SERVER_ADDR=10.241.94.209
declare -x  SERVER_PORT=80
declare -x  REMOTE_ADDR=10.56.81.214
declare -x  DOCUMENT_ROOT=/data/doc/www.example.com/htdocs
declare -x  SERVER_ADMIN=webmaster@tencent.com
declare -x  SCRIPT_FILENAME=/data/doc/www.example.com/cgi-bin/ex/common/www_ex_time.cgi
declare -x  REMOTE_PORT=46151
declare -x  GATEWAY_INTERFACE=CGI/1.1
declare -x  SERVER_PROTOCOL=HTTP/1.1
declare -x  REQUEST_METHOD=POST
declare -x  QUERY_STRING=
declare -x  REQUEST_URI=/cgi-bin/ex/common/www_ex_time.cgi
declare -x  SCRIPT_NAME=/cgi-bin/ex/common/www_ex_time.cgi
declare -x  HTTP_CONNECTION=close
declare -x  all env end
declare -x  112.96.194.222
/proc/[pid]/environ
              This file contains the initial environment that was set when
              the currently executing program was started via execve(2).              
              ......
              If, after an execve(2), the process modifies its environment
              (e.g., by calling functions such as putenv(3) or modifying the
              environ(7) variable directly), this file will not reflect
              those changes.
#include <stdio.h>
#include <stdlib.h>

int main() {
    putenv("HOME=WTF");
    char *home = getenv("HOME");
    printf("pid %d  HOME=%s\n", getpid(), home);
    sleep(300);
}