[C con Clase] Memoria en paráemtros de execv...

Steven Davidson srd4121 en njit.edu
Mar Abr 13 18:50:10 CEST 2010


Hola Gilberto,

Gilberto Cuba Ricardo wrote:
> Gracias Programante y Steven Davidson.
> 
> Sabiendo de quienes vienen las respuestas puedo estar un poco más
> tranquilo, sin embargo, soy un poco más objetivo y no sé cómo poder
> ver esto realmente, que ellas son liberadas, es decir, que sea
> mostrable a través de un programa o a través de un "debugueo".
> 
> 

Supongo que un depurador te puede ayudar, pero ten presente que 
'execv()' es una función del sistema operativo y hace uso de otras 
funciones del sistema usando la memoria del sistema. No te puedo 
garantizar que el depurador tenga permiso para entrar en la memoria del 
sistema, pero sospecho que sí. ¡Inténtalo! :)

Por otra parte, si quieres, te puedo dar el algoritmo de "exec", bajo 
UNIX. Verás que se libera toda la memoria virtual del programa "antiguo" 
y se crean nuevas regiones de memoria virtual para la nueva imagen: el 
ejecutable.

> Programante escribió:
> 
> [CORTE]
> 
>> (y son copias, la cadena original se libera -o puede ser liberada-).
> 
> [CORTE]
> 
> Ahora me pregunto, y ¿cómo es que pueden ser liberadas? Tal vez
> reservando las variables fuera de la función que llama a execv y luego
> liberar.
> 

Sí. Lo que hacer "exec" es copiar estos parámetros de la memoria virtual 
del proceso a la memoria virtual del "kernel" (el núcleo del sistema 
operativo). A veces se usa la pila de datos del S.O., pero otras veces 
se puede crear otra región de memoria virtual del sistema. La cuestión 
es que se crea una copia fuera del proceso a reemplazar.

Cuando el S.O. crea nuevas regiones de memoria para el programa actual, 
entonces se vuelve a copiar los parámetros de "exec" de la memoria del 
sistema a la del programa.

> 
> Steven Davidson escribió:
> 
> [CORTE]
> 
>> Como 'execv()' va a reemplazar la memoria de tu proceso,
>> implícitamente libera la memoria del programa a ser reemplazado.
>> Ésta es la definición de 'execv()' en UNIX. No te puedo garantizar
>> que funcione de la misma manera en otras plataformas, pero sospecho
>> que sí.
> 
> La verdad es que no me la lei completa porque está larga cantidad y
> de contras en inglés. :) Yo uso por ahora Debian 5 Lenny, pero estoy
> haciendo algo bastante genérico y necesito la mayor portabilidad
> posible.
> 

Si vas de un sistema UNIX a otra, no hay ningún problema al usar "exec". 
Eso sí, deberías tener presente que hay otros recursos que un programa 
puede crear fuera de su "alcance". Por lo tanto, cualquier recurso que 
existe fuera de la memoria del proceso existirá cuando se ejecute 
"exec". Esto es porque "exec" sólo afecta el texto (las instrucciones) y 
los datos (variables). Esto se puede hacer fácilmente en UNIX, porque el 
sistema operativo mantiene esta información en regiones separadas en 
memoria. Es decir, las instrucciones del programa están en una región de 
memoria y las variables del programa en otra. Por lo tanto, otros 
recursos que no pertenezcan a estas regiones de memoria no son afectados 
por "exec".

> Fuera de este tema, -y disculpen el OFFTOPIC-, tal vez de los que
> hayan trabajado bastante con la librería Boost, puedan decirme si
> tiene una sus librerías que me sirva para esto, es decir, manipular
> los procesos. Ya ví que Qt lo tiene y me brinda varias facilidades.
> 

Me temo que no conozco Boost, por lo que no puedo ayudarte en esto. La 
verdad es que debería ponerme a aprenderlo porque pertenece al nuevo 
estándar de ANSI C++.


Espero que lo anterior te aclare el tema.

Steven





Más información sobre la lista de distribución Cconclase