184 переменных среды слишком много?

Я пытаюсь найти причину какой-то неуверенности в работе ОС, и меня беспокоят переменные среды.

Программное обеспечение, которое мне было предоставлено, вносит в файл .profile пользователя невероятно большое количество переменных окружения.

Когда я набираю set | wc set | wc результат составляет 9571 байт! Есть 184 записи. Для меня это кажется чрезмерно большим, но у меня нет ничего конкретного, чтобы указать на него и сказать «это неправильно, потому что xyz».

Я ничего не вижу в документации по ulimit, которая говорит об общем размере переменной окружения, но я заинтересован. Я не беспокоюсь об общем использовании памяти (этого достаточно, чтобы сделать то, что мне нужно), но я беспокоюсь о том, что могу обойти некоторые внутренние ограничения и вызывать нечетное поведение в ОС ( возможно, не связано с вопросом, который я задаю, нечетное поведение "заключается в том, что очереди с общей памятью не возвращают мне все данные, которые я вставляю на другой конец. Я получаю около 5% от суммы ).

Каждый запускаемый сценарий, каждая запущенная оболочка и каждый отдельный исполняемый файл получают полную, индивидуальную копию переменных окружения, и я думаю, что 9k слишком велико. Должно ли это быть беспокойством, или я не беспокоюсь ни о чем?

Я запускаю встроенную систему x86 QNX 6.4.1 Neutrino с половиной гигабайта оперативной памяти.

Когда я набираю set | wc результат составляет 9571 байт!

Предполагая, что вы получили этот номер правильно, он на самом деле довольно мал , вероятно, потому, что вы используете QNX. В обычной настольной системе она намного больше. Вот что я получаю от fedora 20:

 > set | wc --bytes 133195 

133 кБ. Я не считал записи, так как многие из них являются исходными функциями ( git кажется, устанавливает много из них), но я просмотрел их, и, похоже, не было ничего неприятного. Несколько кБ больше всего от меня.

Я беспокоюсь о превышении внутреннего внутреннего предела и возникновении нечетного поведения в ОС

Я очень сомневаюсь, что это возможно, потому что отсутствие проверки границ там указывает на очень значительную ошибку в реализации – предотвращение того, чтобы кто-то просто писал длинную переменную для ввода данных в память, должен был быть основной проблемой. Помимо этого, как вы говорите, 9kB ничего не знает о мудрости. Я бы предположил, что поиск по ним выполняется с помощью хеш-таблицы, поэтому количество записей не будет ухудшать производительность.

set отчеты не только переменные среды, но и переменные оболочки, а также некоторые функции оболочки. Использовать env | wc -c env | wc -c чтобы получить размер среды.

Размер среды косвенно ограничен максимальным размером аргументов execve (которые состоят из среды плюс аргументы командной строки). Вы можете получить применимое значение этого предела с помощью getconf ARG_MAX .

3849 байт не кажется особенно высоким. POSIX говорит, что предел может составлять 4096 байт, но с 512 МБ ОЗУ, ваша система не является младшей и, скорее всего, настроена так, чтобы позволить намного больше. В любом случае, если этот предел был поражен, тогда execve завершится с ошибкой; это не имеет ничего общего с общими очередями памяти.