Каков максимальный размер значения переменной среды?

Ну, я поместил свои маршруты в файл json, который я прочитал в начале, и в цикле for в app.js установил маршруты. В файле route.json указывается, какой вид следует вызвать, и ключ для значений, которые будут отправлены в маршрут.
Это работает для многих простых случаев, но мне пришлось вручную создавать некоторые маршруты для особых случаев.

67
задан Community 21 July 2013 в 06:42
поделиться

5 ответов

Я не думаю, что это есть - это ограничение переменной среды в 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;
}
68
ответ дан 24 November 2019 в 14:42
поделиться

Ну, у меня на коробке не меньше 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 . Если не начинается с @ , он использует значение самой переменной окружения.


Что интересно, когда все эти переменные установлены,

21
ответ дан 24 November 2019 в 14:42
поделиться

Точно не знаю, но быстрый эксперимент показывает, что ошибок не возникает, например, при значении 64 КБ:

% perl -e 'print "#include <stdlib.h>\nint main() { return setenv(\"FOO\", \"", "x"x65536, "\", 1); }\n";'\
| gcc -x c -o envtest - && ./envtest && echo $?
0
1
ответ дан 24 November 2019 в 14:42
поделиться

Командная строка (со всеми аргументами) плюс переменная среды должны быть меньше 128 КБ .

0
ответ дан 24 November 2019 в 14:42
поделиться

Я использовал этот очень быстрый и грязный 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)
1
ответ дан 24 November 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: