Каков максимальный размер значения переменной среды?
существует ли ограничение на объем данных, которые могут храниться в переменной среды Linux, и если да, то что это такое?
для Windows, я нашел следующее статьи, которые приведены в:
Windows XP или более поздней версии: 8191 символов
Windows 2000 / NT 4.0: 2047 символов
6 ответов:
Я не думаю, что в Linux существует ограничение на переменную для каждой среды. Общий размер всех переменных среды, собранных вместе, ограничен во время execve (). См. раздел "ограничения на размер аргументов и среды"здесь для получения дополнительной информации.
процесс может использовать setenv() или putenv () для расширения среды за пределы начального пространства, выделенного exec.
вот быстрая и грязная программа, которая создает переменную среды 256 МБ.
#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] = ''; 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; }
Ну, это по крайней мере 4 м на моей коробке. В этот момент, мне стало скучно и ушла. Надеюсь, вывод терминала будет завершен до того, как я вернусь на работу в понедельник : -)
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 может быть недостаточно для вашей переменной среды, вы можете переосмыслить, как вы делаете вещи.
возможно, было бы лучше поместить информацию в файл, а затем использовать переменную среды для ссылки на этот файл. Я видел случаи, когда, если переменная имеет вид
@/path/to/any/fspec, он получает фактическую информацию из файлаpath/to/any/fspec. Если это не начинается с@, он использует значение самой переменной среды.
интересно, что со всеми этими переменными, каждая команда начинает жаловаться, что список аргументов слишком длинный, поэтому, даже если он позволяет вам установить их, он может не иметь возможности запускать программы после того, как вы это сделали (так как он должен передать среду тем запрограммированный.)
Я сделал быстрый тест на моем Linux box со следующим фрагментом:
a="1" while true do a=$a$a echo "$(date) $(numfmt --to=iec-i --suffix=B --padding=7 ${#a})" doneна моем поле (Gentoo 3.17.8-gentoo-r1) это приводит к (последние строки вывода):
Wed Jan 3 12:16:10 CET 2018 16MiB Wed Jan 3 12:16:11 CET 2018 32MiB Wed Jan 3 12:16:12 CET 2018 64MiB Wed Jan 3 12:16:15 CET 2018 128MiB Wed Jan 3 12:16:21 CET 2018 256MiB Wed Jan 3 12:16:33 CET 2018 512MiB xrealloc: cannot allocate 18446744071562068096 bytesИтак: лимит довольно высокий!
я использовал этот очень быстрый и грязный php-код (ниже), модифицируя его для разных значений, и обнаружил, что он работает для переменных длин до 128k. после этого по какой-либо причине он не работает; исключение не возникает, ошибка не сообщается, но значение не отображается в подрешетке.
может быть, это PHP-определенный лимит? Может быть, есть php.параметры ini, которые могут повлиять на это? Или, может быть, есть ограничение на размер vars, который унаследует подрешетка? Может быть, там соответствующие параметры конфигурации ядра или оболочки..
в любом случае, по умолчанию, в CentOS, предел для установки var в среде через putenv в php, кажется, составляет около 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)
точно не знаю, но быстрый эксперимент показывает, что ошибка не возникает, например, с 64kB значения:
% perl -e 'print "#include <stdlib.h>\nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\ | gcc -x c -o envtest - && ./envtest && echo $? 0
Comments