我在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
环境变量在程序的上下文中设置.
当您的程序退出时,您将回到程序启动的上下文中.
C库将环境变量视为您可以阅读的全局设置,getenv并使用setenv/进行调整putenv,并且继承了对该exec系列的调用,但这是一个方便的小说.就内核而言,环境变量是第二组参数main.如果您查看系列的实际系统调用,这一点就变得清晰execve了exec.这是它的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.