Я не уверен, что понимаю источник вашего замешательства, но имейте в виду, что в Unix аргументы командной строки (foo
и bar
изecho foo bar
)и среда строки (FOO=bar
изenv - FOO=bar printenv
)просто копируются ядром в адресное пространство процесса, где к ним просто обращаются, как и к любой другой памяти (через указатели и т. д., );они не передаются как файлы, которые могут быть прочитаны, записаны или отображены в память процессом, как это делают стандартные stdin, stdout, stderr или любые дополнительные файловые дескрипторы.
Это не какой-то закон природы, это просто то, как это работает в Unix. Можно возразить, что это архаично, непоследовательно и неэффективно (— для каждого процесса создается копия всего окружения, даже если он игнорирует все или большую его часть ).
Различные меры могут быть сделаны --в plan9 , строки окружения на самом деле являются файлами в /env
(, что также означает, что они могут совместно использоваться между процессами ).
Кроме того, в Linux можно использовать хак LD_PRELOAD
, чтобы обойти ограничение argv+env, передав все это через файл, созданный с помощью memfd_create
.