Есть ли ограничение на объем данных, которые могут храниться в переменной среды в Linux, и если да, то что это такое?
Для Windows я нашел следующую статью базы знаний, которая резюмирует: Windows XP или новее: 8191 символ Windows 2000 / NT 4.0: 2047 символов
set
команде, у которой ограничение в командной строке составляет 8191 символ. См. Эту статью msdn Тем не менее, это случайное ограничение.Ответы:
Я не думаю, что в 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] = '\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; }
источник
xargs --show-limits
для получения дополнительной информации.Ну у меня на коробке минимум 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-компьютере со следующим фрагментом:
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) это приводит к (последние строки вывода):
Итак: предел достаточно высокий!
источник
n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE);
и я подозреваю, что часть:(n + DEFAULT_ARRAY_SIZE)
переполнена. Все очень хорошо, но мы,Вот две полезные команды:
getconf -a |grep MAX
true | xargs --show-limits
источник
Точно не знаю, но быстрый эксперимент показывает, что ошибок не возникает, например, при значении 64 КБ:
% perl -e 'print "#include <stdlib.h>\nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\ | gcc -x c -o envtest - && ./envtest && echo $? 0
источник
Я использовал этот очень быстрый и грязный php-код (ниже), изменив его для разных значений, и обнаружил, что он работает для переменной длины до 128 КБ. После этого по какой-то причине он не работает; исключение не возникает, ошибка не отображается, но значение не отображается в подоболочке.
Может, это ограничение для php? Может быть, есть настройки php.ini, которые могут на это повлиять? Или, может быть, есть ограничение на размер варов, которые наследует подоболочка? Может есть соответствующие настройки конфигурации ядра или оболочки ..
В любом случае, по умолчанию в CentOS ограничение на установку переменной окружения через putenv в php составляет около 128 КБ.
<?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)
источник
Командная строка (со всеми аргументами) плюс переменная среды должны быть меньше 128 КБ.
источник