Acceda a las variables de entorno usando la función setenv en C
-
Utilice la función
setenv
para exportar variables de entorno en C -
Utilice la variable
envp
para iterar a través de variables de entorno definidas en C -
Utilice la variable
environ
para iterar a través de variables de entorno definidas en C
Este artículo explicará varios métodos para exportar variables de entorno utilizando la función setenv
en C.
Utilice la función setenv
para exportar variables de entorno en C
Cada programa que se ejecuta en sistemas basados en Unix tiene un entorno que recopila pares de valores variables utilizados principalmente por shell y otros programas de espacio de usuario. El programa puede recuperar una sola variable de entorno y su valor con la función getenv
. Pero si se debe definir una nueva variable o se cambia la existente, se debe llamar a la función setenv
. Se necesitan tres argumentos, el primero y el segundo de los cuales son punteros char
que apuntan al nombre de la variable y su valor, respectivamente. El tercer argumento es de tipo int
y especifica si el valor de la variable dada debe sobrescribirse si ya existe en el entorno. El valor distinto de cero de este argumento denota el comportamiento de sobrescritura y el valor cero al contrario.
Sin embargo, tenga en cuenta que la iteración a través de todas las variables de entorno definidas requiere acceder a la variable global especial llamada - environ
, que es un array de cadenas de caracteres terminada en NULL. Alternativamente, se puede declarar la función main
con el tercer argumento envp
para acceder a las variables. En el siguiente ejemplo, imprimimos los punteros environ
y envp
antes y después de la llamada a la función setenv
. Observe que el puntero envp
tiene el mismo valor después de la llamada, mientras que se ha cambiado environ
.
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
int main(int argc, const char *argv[], const char *envp[]) {
printf("environ: %p\n", environ);
printf("envp: %p\n", envp);
setenv("NEW_VAR", "new_value", 1);
puts("----Added NEW_VAR----");
printf("environ: %p\n", environ);
printf("envp: %p\n", envp);
exit(EXIT_SUCCESS);
}
Producción :
environ: 0x7fffa05a7fe8
envp: 0x7fffa05a7fe8
----Added NEW_VAR----
environ: 0x5646431276b0
envp: 0x7fffa05a7fe8
Utilice la variable envp
para iterar a través de variables de entorno definidas en C
El ejemplo de código anterior demuestra por qué se debe evitar la recuperación de variables de entorno utilizando el argumento de la función main
envp
después de llamar a la función setenv
. Cuando se llama a la función setenv
, el entorno se reubica, pero envp
sigue apuntando al antiguo entorno. El siguiente código de ejemplo demuestra el comportamiento erróneo definiendo una nueva variable con la llamada setenv
y luego iterando a través del array de punteros envp
. Tenga en cuenta que también utilizamos la instrucción goto
para saltar al final del bucle si se encuentra la variable denominada NEW_VAR
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[], const char *envp[]) {
if (setenv("NEW_VAR", "new_value", 1) != 0) {
perror("setenv");
exit(EXIT_FAILURE);
}
if (envp != NULL) {
for (size_t i = 0; envp[i] != NULL; ++i) {
if (strcmp(envp[i], "NEW_VAR=new_value") == 0) {
puts(envp[i]);
goto END;
}
}
printf("No such variable found!\n");
}
END:
exit(EXIT_SUCCESS);
}
Producción :
No such variable found!
Utilice la variable environ
para iterar a través de variables de entorno definidas en C
Dado que la solución anterior no puede encontrar la variable recién definida, deberíamos usar la variable environ
declarada externamente. En este caso, incluimos múltiples declaraciones condicionales del preprocesador para hacer que el código sea portátil entre los diferentes sistemas, pero solo se necesita extern char **environ
en la mayoría de los sistemas basados en UNIX. Una vez declarado, podemos iterar a través de la lista de variables usando el mismo bucle que implementamos en el ejemplo anterior.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(_POSIX_) || defined(__USE_POSIX)
extern char **environ;
#elif defined(_WIN32)
_CRTIMP extern char **_environ;
#endif
int main(void) {
if (setenv("NEW_VAR", "new_value", 1) != 0) {
perror("setenv");
exit(EXIT_FAILURE);
}
if (environ != NULL) {
for (size_t i = 0; environ[i] != NULL; ++i) {
if (strcmp(environ[i], "NEW_VAR=new_value") == 0) {
puts(environ[i]);
goto END;
}
}
printf("No such variable found!\n");
}
END:
exit(EXIT_SUCCESS);
}
Producción :
NEW_VAR=new_value
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook