Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Ядро предоставляет сисколл execve. Execve принимает переменные окружения в виде массива строк A=B -
не знаю конкретных причин, почему так сделано, но скорее всего просто потому что писать хэшмапу под
это дело, которая еще и будет выкинута из памяти через относительно небольшое время - дело дорогое и
ненужное, плюс наверняка какой-нибудь лишний пердолинг со стеком. https://man7.org/linux/man-pages/man2/execve.2.html
Го, "человеческий язык" с поддержкой обычных мап из коробки, ничтоже сумляшеся не замечает никакой
проблемы и заставляет пользователя передавать переменные окружения в том же формате, потому что у
языка не только синтаксис должен быть таким же тупым, как программист на нём и вообще мы же тут
делаем вид, что мы C, только лучше. https://golang.org/pkg/os/exec/#example_Command_environment
Докер, "человеческий сервис" с HTTP API, использующим формат JSON с поддержкой обычных мап из коробки,
ничтоже сумляшеся не замечает никакой проблемы и заставляет пользователя передавать переменные
окружения в том же формате, потому что на программист на языке должен быть тупым, как этот язык. https://docs.docker.com/engine/api/v1.24/#create-a-container
В результате мы имеем пачку долбоебов, из-за которых оперирующие (мапами / объектами / словарями / как угодно назовите)
нормальные люди должны вести себя как типичные гошники.
Да нет, его задача -- доставить эти строчки до запускаемой проги as is. Да и там парсер скорее всего разберёт это как переменную "GO" со значением "V=NO".
Есть некоторая память, связанная с процессом.
Ну да, эта память скорее всего ядерная, юзермоду не доступная.
Но она же тоже копируется (точнее, не удаляется)
stdout (циферка) указывает же на тот же самый tty, например
вощем я читнул таки ман
execve замещает процесс with newly initialized stack, heap, and (initialized and uninitialized) data segments.
но!
By default, file descriptors remain open across an execve().
но ! File descriptors that are marked close-on-exec are closed;
так что файл может и закрыться, смотря как откроешь
ps: вектор (строку) с переменными можно явно передать, а если не передать, то онаскоприуется из переменной "environ" (глобальная позикс переменная с окружением)
А есть, кстати, проги которые это абузят для горячего апдейта. Скидываешь данные в шаред мемори, обновляешь код exec'ом, а все сокеты да пайпы у тебя остаются унаследованы и связь с клиентами не прерывается.
bormand # 0
MAPTbIwKA # 0
кстати, пинда тоже блок переменных строкой принимает
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
у винды это где-то в PEBе лежит вроде, у прыща не знаю как называется, PCB небось?. Но видно тут
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
ты имел ввиду, что остальные странички ведут себя как корова, а именно этот блок честно копируется?
bormand # 0 ⇈
Большинство старых страничек тупо дропается. Мы же про exec, а не про fork.
MAPTbIwKA # 0 ⇈
а дескрипторы он не наследует разве? А терминал?
наследует же
Вообще обычно же делают fork, а потом exec, иначе ты сам себя заместишь, не завезли же NTшный CreateProcess
bormand # 0 ⇈
Это же просто циферки... Я так понимаю, в юзермодной части о них вообще ничего нет.
> терминал
Обычный дескриптор, не?
MAPTbIwKA # 0 ⇈
Есть некоторая память, связанная с процессом.
Ну да, эта память скорее всего ядерная, юзермоду не доступная.
Но она же тоже копируется (точнее, не удаляется)
stdout (циферка) указывает же на тот же самый tty, например
MAPTbIwKA # 0 ⇈
execve замещает процесс with newly initialized stack, heap, and (initialized and uninitialized) data segments.
но!
By default, file descriptors remain open across an execve().
но !
File descriptors that are marked close-on-exec are closed;
так что файл может и закрыться, смотря как откроешь
ps: вектор (строку) с переменными можно явно передать, а если не передать, то онаскоприуется из переменной "environ" (глобальная позикс переменная с окружением)
Desktop # 0 ⇈
MAPTbIwKA # 0 ⇈
bormand # 0 ⇈
А есть, кстати, проги которые это абузят для горячего апдейта. Скидываешь данные в шаред мемори, обновляешь код exec'ом, а все сокеты да пайпы у тебя остаются унаследованы и связь с клиентами не прерывается.
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
bormand # 0 ⇈
> getenv("SH")
Найди 10 отличий? Не понял твой вопрос.
guest # 0 ⇈
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
я опечатался
bormand # 0 ⇈
MAPTbIwKA # 0 ⇈
Fike # 0 ⇈
Fike # 0 ⇈
MAPTbIwKA # 0 ⇈
збс.
итого, в линуксе есть /etc/profile, /etc/bash.bashrc (для интерактивных логинов) и блядь /etc/enviroment какой-то
Fike # 0 ⇈
Fike # 0 ⇈
походу да, лол.
Desktop # 0
3_dar # 0
MAPTbIwKA # 0 ⇈
Desktop # 0 ⇈
bugs be bad
me bugs fixed
me guhd
MAPTbIwKA # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
обии
Fike # 0 ⇈
MAPTbIwKA # 0 ⇈
Fike # 0 ⇈
Desktop # 0 ⇈