Acceda a las variables de entorno usando la función setenv en C

Jinku Hu 12 octubre 2023
  1. Utilice la función setenv para exportar variables de entorno en C
  2. Utilice la variable envp para iterar a través de variables de entorno definidas en C
  3. Utilice la variable environ para iterar a través de variables de entorno definidas en C
Acceda a las variables de entorno usando la función setenv 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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