Почему моя среда полна ␀s?

У меня есть процесс, среда которого следующая:

root@a-vm:/proc/1363# hexdump -C environ 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 0000016c 

Я никогда не видел ничего подобного; Я ожидаю, что environ содержит nul terminated key=value пары, поэтому этот результат нарушает всевозможные утверждения. Я смотрю на известную ошибку ядра, или есть какой-то законный способ в Unix / Linux для этого? (… и если да, почему? Почему ядро ​​даже допускает эту бессмыслицу?)

(на Linux, 3.13.0 / Ubuntu Trusty)

(Я столкнулся с этим, пытаясь понять, почему этот процесс не пишет какой-то временный вывод в правильное место, предполагается, что он использует определенный каталог для хранилища temp, и он информирован об этом каталоге, установив переменную env TMP , но я Установка TMP на то, что выглядит как обычный путь, а не пучок nuls, и я никогда не видел полностью пустой env.

  • Массивы в Zsh. Проверьте, не определена ли какая-либо из следующих переменных
  • Набор переменных среды, но не соблюдается
  • Легкий способ восстановления вашей ПАНЕЛИ
  • Интерактивная оболочка со средой, идентичной cron
  • Как печатать только определенные переменные (переменные оболочки и / или среды) в bash
  • Как я могу сделать общедоступную переменную в Linux, которую будут видеть все пользователи?
  • Из какого пакета Debian есть / etc / environment?
  • Почему .bash_profile не может установить переменную PS1?
  • 2 Solutions collect form web for “Почему моя среда полна ␀s?”

    Это не вздор, для Linux это законный способ, и ваши ожидания ошибочны.

    Аргументы аргумента и среды, переданные в код запуска программы ядром, хранятся в обычной виртуальной памяти прикладного пространства, как и любые другие данные программы; и, как и любые другие переменные данных программы, они могут быть изменены. Для программ вполне законно изменять их.

    (Обратите внимание, что это с точки зрения того, что ядро ​​поставляет и применяет. Что могут сказать стандарты для определенных языков программирования, не обязательно одно и то же. Но что касается ядра, это просто область приложения-пространства виртуальная память для программных данных, которые можно читать и записывать. Ядру все равно, какой язык программирования вы скомпилировали с вашего машинного кода.)

    Файл /proc/${PID}/environ – это просто окно в эту виртуальную память прикладного пространства. Вместо того, чтобы помнить фактические данные среды процесса, Linux просто запоминает начальный и конечный адреса области окружения, с которой он начал процесс, а файл /proc/${PID}/environ просто считывает все, что находится в этой памяти прямо сейчас. Вы не должны ожидать, что этот файл содержит список строк с концевыми символами. Это ошибочное ожидание.

    Для изменения памяти, содержащей эти строки, нет библиотеки GNU C. Но разные программы имеют свои собственные функции.

    Например, рассмотрим OpenSSH. Сервер OpenSSH изменяет то, что ps показывает для своего вектора аргументов, чтобы читать такие вещи, как sshd: JdeBP [priv] .

    Сервер OpenSSH содержит код, который пытается подражать Linux, что он может делать с библиотекой BSD C на OpenBSD. В OpenBSD есть функция библиотеки BSD C с именем setproctitle() которая переписывает вектор аргумента процесса, как сообщает команда ps . Он вызывает sysctl() для передачи нового аргумента в ядро, которое ps может считывать с помощью sysctl() . У FreeBSD есть аналогичная функция.

    В Linux, как объясняется, ядро ​​не запоминает фактические аргументы и среду, а только начальный и конечный адреса областей памяти, в которых он первоначально размещал их при запуске процесса. Таким образом, порт Linux OpenSSH имеет функцию совместимости setproctitle() которая вместо этого перезаписывает вышеупомянутую область памяти.

    Эта функция совместимости вычисляет общий размер области окружения и области аргументов и перезаписывает все это с помощью новой строки аргумента. Он делает это, потому что в обычном случае программы, которые вызывают setproctitle() хотят записать более длинный набор данных аргументов, чем тот, который первоначально был изначально выполнен. sshd часто делает. Таким образом, он позволяет новым аргументам перезаписывать область окружения, которая следует за зоной аргумента, предоставляя программам больше места для более длинных наборов строк аргументов.

    Важно отметить, что он также заполняет неиспользуемую часть области, которую не нужно было перезаписывать, до исходной длины общих аргументов и данных окружающей среды с помощью ␀s.

    И то, что вы видите, является точным результатом этого. Если вы обнаружите серверный процесс OpenSSH в своей системе, вы обнаружите, что в его /proc/${PID}/environ есть много ␀s.

    дальнейшее чтение

    • setproctitle . Руководство FreeBSD 11.0.
    • setproctitle . Руководство OpenBSD.
    • setproctitle() . OpenSSH Portable Release.
    • environ_read() . фс / Proc / основание. Ядро Linux. Свободные электроны.

    Это полностью выполнимо, написав NUL s в ячейке памяти, в которой находятся переменные среды:

     #include <stdio.h> #include <unistd.h> extern char **environ; int main(void) { int i; char *p = *environ; /* hopefully your ENV is longer than this */ for (i = 0; i < 10; i++) *(p + i) = 0; printf("hexdump -C /proc/%d/environ\n", getpid()); sleep(99999); } 

    Если вместо этого вы запускаете программу с пустой средой, то файл окружения будет полностью пустым:

     execle("/bin/sleep", "sleep", "999", (char *)NULL, (char *const) NULL) 

    Таким образом, этот случай – это что-то, выполняемое процессом или процессом после его запуска (и мало что может помешать этому, если вы каким-то образом не заблокировали эту память, а затем вызовы setenv(3) могут быть проблематичными …).

    Interesting Posts

    Какова цель запуска xterm из обычного терминала

    Как вам заставить fsck при перезагрузке на FreeBSD10?

    Файл bad known_hosts при подключении к балансируемому домену

    Что случилось с командой exit на моем терминале?

    Яркость клавиш вверх / вниз не работает

    У меня есть RPM, и вы хотите создать онлайн-репо

    переименование каталога и его поддиректоров, не затрагивая их файлы

    Chrubuntu 12.04 Bluetooth не обнаруживает устройства

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

    Cinnamon: фоновый рисунок рабочего стола из вложенной структуры каталогов?

    Ли Linux пересылает пакеты из WiFi в Intel AMT Management Engine?

    Как удалить устаревшие журналы с помощью logrotate?

    создать установщик debian с настраиваемым ядром

    Связывание доменного имени с Apache Виртуальный хост на VPS

    Как процитировать строку, содержащую знак доллара $ и одинарную цитату '?

    Linux и Unix - лучшая ОС в мире.