使用setenv()后为什么环境变量未设置

kin*_*er1 6 c linux

我在Linux中写了一个C程序来设置环境变量的使用值setenv,但执行后,当我运行set或者export,环境变量本身似乎被取消设置.为什么?

这是代码片段:

int main()
{
  char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr;
  struct sigaction sa;

  sa.sa_handler=SIGSEGV_handler;
  sigaction(SIGSEGV, &sa, NULL);

  if(setenv("ENV1", "3", 1) == 0)
         printf("ENV1 set to 3\n");
  else
         fprintf(stderr, "setenv failed on ENV1");
Run Code Online (Sandbox Code Playgroud)

Did*_*set 13

环境变量在程序的上下文中设置.

当您的程序退出时,您将回到程序启动的上下文中.

  • "[..]每个进程都有一个单独的环境副本.因此,您无法在另一个进程中更改环境变量的值,例如shell." 来自[here](http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC8). (3认同)

zwo*_*wol 5

C库将环境变量视为您可以阅读的全局设置,getenv并使用setenv/进行调整putenv,并且继承了对该exec系列的调用,但这是一个方便的小说.就内核而言,环境变量是第二组参数main.如果您查看系列的实际系统调用,这一点就变得清晰execveexec.这是它的C原型:

int execve(const char *filename, char *const argv[], char *const envp[]);
                                                     ^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

看到第三个论点?这是进程A设置进程B的环境变量的唯一方法.1 因此,进程A可以设置进程B的环境变量的唯一时间是进程A 通过和启动进程B的时间.forkexecve

你的程序是 shell 启动的,所以shell必须设置它的环境变量副本,但它没有办法将更改推回到shell - 就像C函数无法改变一样其参数在其调用者中的值.

1不要提起ptrace.