Supongo que estás en UNIX/Linux. Esto se debe a que cada vez que ejecutas el programa el sistema está lanzando una shell para esa ejecución. Al crear esa shell "hija", hereda el entorno y dispone de la variable. Por eso la primera vez puedes ver el valor. Después tu mismo des-asignas la variable.
Cuando vuelves a asignar la variable en la shell, lo estás haciendo en una distinta de la shell (del entorno) donde se está ejecutando el programa.
No funcionará como tú quieres.
No sólo por lo que han comentado de ser una subshell; Tu programa obtiene el "environment" de un tercer parámetro de la funcion main() que casi nadie usa (char **envp).
Es decir, las variables de entorno no son algo dinámico, sino estático desde el inicio de tu programita.
Utiliza sockets, un fichero FIFO, memoria compartida, signal() ... (busca info sobre ipc -inter program communication-) porque no creo que consigas hacerlo funcionar leyendo el environment.
Suerte.
Re:getenv
de pobrecito hablador
(Puntos:0)
Jueves, 19 Enero de 2006, 14:32h
Re:getenv
de McPolu
(Puntos:2)
Jueves, 19 Enero de 2006, 14:37h
Re:getenv
de Tom Bomba
(Puntos:2)
Jueves, 19 Enero de 2006, 17:24h
Re:getenv
de Tom Bomba
(Puntos:2)
Jueves, 19 Enero de 2006, 17:19h
Re:getenv
de nadid
(Puntos:1)
Jueves, 19 Enero de 2006, 19:34h
Re:getenv
de Tom Bomba
(Puntos:2)
Viernes, 20 Enero de 2006, 14:07h
Yo no me meto en si funcionara o no, pero porque haces esto:
if (comando != NULL)
{
ejecutar = true;
}
else
{
ejecutar = false;
}
if (ejecutar == true)
{
codigo
}
en vez de hacer esto otro??
if (comando != NULL)
{
codigo
}
Re:Y porque
de nadid
(Puntos:1)
Jueves, 19 Enero de 2006, 19:02h
por
pobrecito hablador
el Jueves, 19 Enero de 2006, 15:37h
(#680915)
Primero, como ya te han dicho queda un poco estúpido lo de if(a)algo = true; else algo = false;. Es tan estúpido como los que hacen if(a == true) (cosa que, por cierto, en C es una cagada suprema) en vez de simplemente if(a) (por cierto también haces eso). Si, además, vas a usar tus propias "palabras reservadas" true y false ponlas en mayúsculas, como es norma en los defines. Tu programa funcionará igual (de mal en este caso), pero será bastante más legible.
Segundo. Dentro del switch, en la rama que se supone que ejecuta el programa, haces un if con una comprobación estúpida. Si se ha entrado en el switch es porque ejecutar es cierto, así que comando no es el puntero nulo. De cajón.
Tercero. Declaras la función como que devuelve un entero, lo que parece coherente con una función que ejecuta algo así. Lo que no tiene ningún sentido es que pase lo que pase la función siempre devuelva cero. Para devolver siempre lo mismo... Encima en el programa que la llama comprobarás el código de retorno, como si lo viera.
Cuarto. Espera activa. Tu programa más que una especie de demonio es una putada. Utiliza una señal para notificarle que debe buscar un nuevo comando a ejecutar (aunque no tengas la más remota idea de cómo hacérselo llegar) o crea un canal de comunicaciones (un fifo, un pipe, un socket...) con bloqueo para poder tener un esquema de comunicación síncrona.
Quinto. Variables globales. Sin comentarios. Saca la comprobación de la variable desactivar de esa función y déjala en la que la invoque.
Sexta, y seguramente la más grave. Si no sabes nada de sistemas, para qué coño te pones a hacer programación de sistemas? Si mi memoria no me falla (y me siento perezoso para confirmarlo en google), la llamada getenv devuelve un puntero al entorno. Inmediatamente después destruyes (realmente se destruye o no dependiendo del entorno concreto) la variable, con lo que dejas tu puntero apuntando a una zona que ya tendrá sólo Dios sabe qué. Además, la llamada devuelve (igual no era esta, sino otra de la familia, pero no seré yo quien lo busque ahora) toda la variable de entorno, esto es: "nombre_variable=valor_variable", así que más te vale hacer un sscanf sobre lo que leas del entorno. Cuando un programa se ejecuta, lo hace sobre un entorno, por mucho que tú en una consola, en otra o en el obispado cambies el entorno, el del programa seguirá siendo el que era. Si hay algún modo de cambiarlo dinámicamente, que lo habrá, no es ni trivial (como sí lo es leerlo o cambiar el propio) ni está extendido.
Así que tu programa lo que hace es quedarse con dónde está el entorno, destruirlo, imprimirlo porque no ha dado tiempo a que la memoria se corrompa, intentar volver a buscarlo y (probablemente, habría que ver el resto de programa) quedarse colgado convirtiendo tu pequeño ordenador en un crematorio.
Bienvenido al apasionante mundo de la programación :-)
Bueno... tampoco hay que ponerse asi, que la gente no nace aprendida. Unos comentarios:
A veces pongo if(TRUE==a) por legibilidad; dependiendo del tipo de 'a' puede serle util al mantenedor de la aplicacion.
Ahi tienes razon... a veces. En un desarrollo hecho por el mismo equipo me gusta aplicar la norma de "Lo ya comprobado en una capa superior no se comprueba en una capa inferior" pero en una libreria, o si el codigo de un equipo lo usa otro equipo diferente prefiero comprobarlo todo. Al menos con sentencias ASSERT.
Y bueno... lo de poner return puede tener su sentido para no ver el tipico "warning: main does not return nasti de plasti" y no tener que biscar el #pragma warning de turno.
Y si... la espera activa es de lo peor que se puede hacer; si no se quiere meter en berenjenales con un Sleep() bien colocado alivia la carga, aunque sigue siendo un tanto chapucero :/
Aqui te doy toda la razon... las variables globales -e incluso las variables de clase si se usan como variables globales- son la puerta al infierno.
Bueno... la gente tiene que cometer errores para aprender.
--
En España la mejor manera de guardar un secreto es escribir un libro.
Ejecución en UNIX
(Puntos:4, Interesante)( http://www.jesus-y-bea.com/ | Última bitácora: Domingo, 02 Diciembre de 2007, 22:22h )
Cuando vuelves a asignar la variable en la shell, lo estás haciendo en una distinta de la shell (del entorno) donde se está ejecutando el programa.
getenv
(Puntos:4, Informativo)( http://barrapunto.com/ )
No sólo por lo que han comentado de ser una subshell; Tu programa obtiene el "environment" de un tercer parámetro de la funcion main() que casi nadie usa (char **envp).
Es decir, las variables de entorno no son algo dinámico, sino estático desde el inicio de tu programita.
Utiliza sockets, un fichero FIFO, memoria compartida, signal() ... (busca info sobre ipc -inter program communication-) porque no creo que consigas hacerlo funcionar leyendo el environment.
Suerte.
Y porque
(Puntos:2, Inspirado)( Última bitácora: Martes, 20 Diciembre de 2005, 16:38h )
Aprendiendo a programar...
(Puntos:0)Segundo. Dentro del switch, en la rama que se supone que ejecuta el programa, haces un if con una comprobación estúpida. Si se ha entrado en el switch es porque ejecutar es cierto, así que comando no es el puntero nulo. De cajón.
Tercero. Declaras la función como que devuelve un entero, lo que parece coherente con una función que ejecuta algo así. Lo que no tiene ningún sentido es que pase lo que pase la función siempre devuelva cero. Para devolver siempre lo mismo... Encima en el programa que la llama comprobarás el código de retorno, como si lo viera.
Cuarto. Espera activa. Tu programa más que una especie de demonio es una putada. Utiliza una señal para notificarle que debe buscar un nuevo comando a ejecutar (aunque no tengas la más remota idea de cómo hacérselo llegar) o crea un canal de comunicaciones (un fifo, un pipe, un socket...) con bloqueo para poder tener un esquema de comunicación síncrona.
Quinto. Variables globales. Sin comentarios. Saca la comprobación de la variable desactivar de esa función y déjala en la que la invoque.
Sexta, y seguramente la más grave. Si no sabes nada de sistemas, para qué coño te pones a hacer programación de sistemas? Si mi memoria no me falla (y me siento perezoso para confirmarlo en google), la llamada getenv devuelve un puntero al entorno. Inmediatamente después destruyes (realmente se destruye o no dependiendo del entorno concreto) la variable, con lo que dejas tu puntero apuntando a una zona que ya tendrá sólo Dios sabe qué. Además, la llamada devuelve (igual no era esta, sino otra de la familia, pero no seré yo quien lo busque ahora) toda la variable de entorno, esto es: "nombre_variable=valor_variable", así que más te vale hacer un sscanf sobre lo que leas del entorno. Cuando un programa se ejecuta, lo hace sobre un entorno, por mucho que tú en una consola, en otra o en el obispado cambies el entorno, el del programa seguirá siendo el que era. Si hay algún modo de cambiarlo dinámicamente, que lo habrá, no es ni trivial (como sí lo es leerlo o cambiar el propio) ni está extendido.
Así que tu programa lo que hace es quedarse con dónde está el entorno, destruirlo, imprimirlo porque no ha dado tiempo a que la memoria se corrompa, intentar volver a buscarlo y (probablemente, habría que ver el resto de programa) quedarse colgado convirtiendo tu pequeño ordenador en un crematorio.
Bienvenido al apasionante mundo de la programación :-)
Re:Aprendiendo a programar...
(Puntos:5, Inspirado)( http://mcpolu.blogspot.com/ | Última bitácora: Miércoles, 05 Marzo de 2014, 00:04h )
Bueno... tampoco hay que ponerse asi, que la gente no nace aprendida. Unos comentarios:
En España la mejor manera de guardar un secreto es escribir un libro.
cambiar variable de entorno dinamicamente
(Puntos:0)gdb
Las variables de entorno están en la parte alta de la pila, en x86 normalmente lo tendrás un poco por debajo de 0xc0000000.
¿Te vale este método?