¿Cómo funciona putenv () / setenv () sin cambiar toda la pila de usuarios?
He leído varias publicaciones aquí y todavía estoy confundido acerca de cómo setenv()
funciona:
- linux-donde-están-las-variables-de-entorno-almacenadas
- dónde-está-el-entorno-cadena-real-almacenada
- cómo-programo-mi-propio-setenv
Tengo entendido que las variables de entorno se almacenan como un grupo de cadenas "foo = bar \ 0" continuamente en la parte inferior de la pila de usuarios, y luego hay una matriz envp[]
de punteros que apuntan a estas cadenas, también cerca de la parte inferior de la pila de usuario. La pila de usuarios crece sobre estos bytes, lo que significa que no es trivial agregar más cosas al área de cadenas o la matriz de punteros. Entonces, ¿cómo setenv()
funciona si se establece una nueva variable (es necesario agregar un elemento a envp[]
), o se cambia una variable pero la nueva cadena de valor es más larga que la anterior (lo que hace imposible la modificación en el lugar), sin cambiar (casi) el ¿Toda la pila de usuarios para dejar espacio para los recién llegados?
Una pregunta algo relacionada es si bash
mantiene una lista interna de variables configuradas localmente, y cuando el usuario export
utiliza la variable configurada localmente, bash
simplemente la elimina de esta lista administrada localmente y la agrega a la parte inferior del área de cadena de pila mencionada anteriormente e inserta su puntero a la matriz de punteros envp[]
, de modo que sus procesos secundarios hereden automáticamente las variables exportadas?
Respuestas
Tengo entendido que las variables de entorno se almacenan como ...
Su comprensión es sólo parcialmente correcta. :sonreír:
... sin cambiar (casi) toda la pila de usuarios para dejar espacio para los recién llegados?
Eso sería imposible. Independientemente de si el lenguaje en el que se escribió el programa era C o el sistema operativo era UNIX. Por ejemplo, porque los punteros de la pila pueden hacer referencia a otras ubicaciones de la pila.
Lo primero que hay que tener en cuenta es que el lugar donde se almacenan las variables de entorno en un nuevo proceso depende de la arquitectura. La mayoría de las implementaciones de UNIX, en la mayoría de las arquitecturas de CPU, lo almacenan en la pila como lo describió. Pero literalmente no hay nada en la especificación C que exija esa solución. Además, si modifica el entorno, la implementación es gratuita para copiar el bloque de las variables de entorno existentes en una nueva ubicación en la memoria. La implementación de C es libre de mover el bloque de env vars y actualizar la __environ
var mágica .
Una pregunta algo relacionada es si bash mantiene una lista interna de variables establecidas localmente ...
No de la manera que usted describe. Mantiene una "lista interna" de variables establecidas localmente. Pero no lo usa de la manera que usted sugiere.
Tengo curiosidad por saber qué te impulsó a abrir este problema.