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

Steven Davidson srd4121 en njit.edu
Dom Abr 11 20:15:30 CEST 2010


Hola Gilberto,

Gilberto Cuba Ricardo wrote:
> Hola Lista,
> 
>   Hace poco empiezo a trabajar con la función que hago referencia en
>   el asunto del email (execv), que ejecuta un proceso creado
>   anteriormente con fork(), en linux, pero que para ello necesita de
>   dos parámetros, el primero una cadena terminada en '\0' con la
>   ubicación y nombre del programa, y por segundo parámetro un arreglo
>   con los parámetros que se la pasarán al programa.
> 
>   En efecto esto no es problema, ni mi duda, sino que para ello debo de
>   crear digamos, o así es por lo menos como yo lo hago, en una función
>   externa, que manipula los parámetro y se los pasa a execv, pero que
>   en ese proceso reservo un poco de memoria para algunas
>   variables que necesita la función, y me encuentro que durante la
>   ejecución, cuando se ejecuta esa línea, si todo sale bien, sale de
>   la función que lo contiene. Y mi duda surge aquí, ¿qué pasa con toda
>   la memoria que yo había reservado para pasársela a la función execv?
>   ¿queda sin liberar o ella automáticamente la libera?
> 
>   O tal vez alguien me pudiera dar otra pista de como implementar esto
>   de forma tal que no se quede colgado ese espacio de memoria
>   reservado.
> 

Por lo que entiendo de lo que nos cuentas, creas memoria dinámicamente 
dentro de una función. Esta memoria seguirá existiendo fuera de la 
función y durante la ejecución del programa hasta que se libere. En 
general, deberías liberar la memoria tú mismo, pero los sistemas 
operativos existentes liberarán la memoria cuando el programa termine.

Por ejemplo,

char ** CrearParametros()
{
   char **pParams;  // usamos 'new[]' para crear memoria dinámicamente
   ...
   return pParams;
}

Ahora bien, la otra posibilidad es que esa otra función que invocas 
automáticamente invoca a 'execv()' y por tanto, no hay posibilidad de 
volver a tu programa para realizar "limpieza". En tu caso, quieres 
liberar la memoria que pasaste a esta otra función. Pero claro, al no 
volver, no tienes la oportunidad de liberar la memoria.

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


Espero que esto te oriente.

Steven





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