Dee*_*ter 4 shell environment-variables posix
是否存在用户/调用无法覆盖的环境变量名称setenv
?据我从 POSIX1.2008 了解到,任何进程都可以编辑环境块,但必须避免覆盖 LANG 等变量。
环境是一个字符串列表var=value
(按照约定),它作为第三个参数传递给 execve() 系统调用。
当它开始执行新命令时,该列表被放在进程堆栈的某个位置,就像参数列表一样(另一个字符串列表作为第二个参数传递给execve()
)。
在使用 libc(大多数)的程序中,在main()
调用函数之前调用的初始化代码使这些环境字符串可用作environ
数组。
的libc
还提供了putenv
与setenv
可修改的功能(的拷贝),该列表,该程序接收。然后,该维护,修改的副本将被传递到由该方法或任何通过它的儿童的执行的下一个命令execvp()
/ execl()
/ system()
/ popen()
libc中(其本身结束调用的...功能execve()
系统调用)。
现在,当您构建手动传递给execve()
系统调用的字符串列表时,您可能会传递类似foo
(没有=
字符)或=bar
(具有空变量名称)之类的字符串,setenv
不会让您这样做(setenv("", "bar", 1)
被拒绝)。
setenv("a=b", "c")
也会被拒绝。因此,将被定义的字符串setenv
将始终采用x=y
其中x
可能不为空的格式。
这是唯一的限制(也适用于putenv
)。好吧,那些是 NUL 终止的字符串,当然 NUL 字符不能出现在变量名称或值中。
setenv("*", "x", 1)
,或者setenv("\n\n", "", 1)
就setenv()
内核而言都可以。现在,你是否能够用这些做任何有用的事情是另一回事。