¿Cómo funciona putenv () / setenv () sin cambiar toda la pila de usuarios?

Aug 20 2020

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 bashmantiene una lista interna de variables configuradas localmente, y cuando el usuario exportutiliza la variable configurada localmente, bashsimplemente 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

KurtisRader Aug 20 2020 at 12:35

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 __environvar 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.