什么是环境variables值的最大值?

Linux上的环境variables中可以存储的数据量是否有限制?如果是这样的话:那是什么?

对于Windows,我发现以下知识库文章总结为:Windows XP或更高版本:8191个字符Windows 2000 / NT 4.0:2047个字符

我不认为在Linux上有一个每个环境variables的限制。 所有环境variables放在一起的总大小在execve()时间是有限的。 有关更多信息,请参阅“参数和环境的大小限制”。

一个进程可以使用setenv()或putenv()来增加超出exec分配的初始空间的环境。

这是一个快速和肮脏的程序,创build一个256 MB的环境variables。

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { size_t size = 1 << 28; /* 256 MB */ char *var; var = malloc(size); if (var == NULL) { perror("malloc"); return 1; } memset(var, 'X', size); var[size - 1] = '\0'; var[0] = 'A'; var[1] = '='; if (putenv(var) != 0) { perror("putenv"); return 1; } /* Demonstrate E2BIG failure explained by paxdiablo */ execl("/bin/true", "true", (char *)NULL); perror("execl"); printf("A=%s\n", getenv("A")); return 0; } 

那么,我的箱子至less有4米。 那时候,我感到厌倦,不知所措。 希望terminal输出能在星期一回来之前完成:-)

 export b1=A export b2=$b1$b1 export b4=$b2$b2 export b8=$b4$b4 export b16=$b8$b8 export b32=$b16$b16 export b64=$b32$b32 export b128=$b64$b64 export b256=$b128$b128 export b512=$b256$b256 export b1k=$b512$b512 export b2k=$b1k$b1k export b4k=$b2k$b2k export b8k=$b4k$b4k export b16k=$b8k$b8k export b32k=$b16k$b16k export b64k=$b32k$b32k export b128k=$b64k$b64k export b256k=$b128k$b128k export b512k=$b256k$b256k export b1m=$b512k$b512k export b2m=$b1m$b1m export b4m=$b2m$b2m echo $b4m AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA : : : : : : : : : : : : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 

如果您担心4M可能不足以满足您的环境variables,那么您可能需要重新考虑如何做事。

也许把信息放到一个文件中然后用一个环境variables来引用这个文件会更好。 我见过的情况下,如果variables的forms是@/path/to/any/fspec ,它会从文件path/to/any/fspec获取实际的信息。 如果它@开始,它将使用环境variables本身的值。


有趣的是,在设置了所有这些variables的情况下,每一个命令都开始抱怨参数列表太长了,即使它允许你设置它们,也可能无法在完成之后启动程序(因为它必须将环境传递给这些程序)。

不知道确切的,但一个快速的实验表明,没有错误发生,例如与64kB的值:

 % perl -e 'print "#include <stdlib.h>\nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\ | gcc -xc -o envtest - && ./envtest && echo $? 0 

我用这个非常快速和肮脏的PHP代码(下面),修改它为不同的值,并发现它适用于不同的长度高达128K。 之后,无论什么原因,这是行不通的。 没有发生exception,没有报告错误,但是这个值在子shell中没有显示出来。

也许这是一个PHP的具体限制? 也许有php.ini设置可能会影响它? 或者也许有一个子shell将inheritance瓦尔的大小限制? 也许有相关的内核或shellconfiguration设置..

无论如何,默认情况下,在CentOS中,在php中通过putenv设置var的限制似乎是128k左右。

 <?php $s = 'abcdefghijklmnop'; $s2 = ""; for ($i = 0; $i < 8100; $i++) $s2 .= $s; $result = putenv('FOO='.$s2); print shell_exec('echo \'FOO: \'${FOO}'); print "length of s2: ".strlen($s2)."\n"; print "result = $result\n"; ?> 

版本信息 –

 [root@localhost scratch]# php --version PHP 5.2.6 (cli) (built: Dec 2 2008 16:32:08) <..snip..> [root@localhost scratch]# uname -a Linux localhost.localdomain 2.6.18-128.2.1.el5 #1 SMP Tue Jul 14 06:36:37 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux [root@localhost scratch]# cat /etc/redhat-release CentOS release 5.3 (Final) 

命令行(所有参数)加上环境variables应该小于128k。