Lista de variables de entorno con C en UNIX

3 minutos de lectura

¿Hay alguna manera de enumerar las variables de entorno y recuperar valores usando C?

avatar de usuario
carpintero mate

Echa un vistazo a la environ variable global.

extern char **environ;

Podría definirse en unistd.h (echa un vistazo a la environ (5) página del manual anterior).

Aquí hay una pequeña demostración de código que escribí:

#include <stdio.h>
extern char **environ;

int main()
{
    for (char **env = environ; *env; ++env)
        printf("%s\n", *env);
}

He aquí cómo usarlo:

[email protected]:~/Desktop$ make enumenv CFLAGS=-std=c99
cc -std=c99    enumenv.c   -o enumenv
[email protected]:~/Desktop$ ./enumenv 
ORBIT_SOCKETDIR=/tmp/orbit-matt
SSH_AGENT_PID=1474
TERM=xterm
SHELL=/bin/bash
... (so forth)

  • No está definido en unistd.h, o si lo está, su sistema no es compatible con POSIX. POSIX requiere que declare explícitamente extern char **environ; si quieres usarlo.

    – R.. GitHub DEJA DE AYUDAR A ICE

    13 de agosto de 2010 a las 4:03

  • @R, +1. En mi sistema al menos, solo se declara en unistd.h si __USE_GNU está establecido, lo que indica que es una extensión. (FWIW, __environtambién una extensión, se declara incondicionalmente).

    – Mateo Flaschen

    13 de agosto de 2010 a las 4:20

  • @R..: hasta el estándar POSIX 2008, tenías razón; desde entonces, <unistd.h> ha dado el paso sensato de exigirlo. Era la única variable sin declaración en un encabezado del sistema. El único bicho raro que queda que yo sepa es union semun.

    –Jonathan Leffler

    13 de agosto de 2010 a las 6:03

  • Disculpas; Estoy corregido. He leído versiones anteriores de POSIX en detalle, pero no he llegado a leer POSIX 2008.

    – R.. GitHub DEJA DE AYUDAR A ICE

    13 de agosto de 2010 a las 6:22

  • @Jonathan, no sabía nada de esto semun cosa. aterrador.

    – Jens Gusted

    13 de agosto de 2010 a las 6:26

La información del entorno se puede pasar como un parámetro adicional a main. No sé si es compatible o no, pero definitivamente funciona (probado en Ubuntu). Simplemente defina el argumento adicional y es una matriz de punteros char terminados por un puntero NULL. Lo siguiente imprimirá el lote.

#include <stdio>

int main(int argc, char *argv[], char *envp[])
{
  int index = 0;
  while (envp[index])
    printf("%s\n", envp[index++];
}

  • En la práctica, esto funciona en la mayoría de los dispositivos, pero POSIX no lo especifica. Usar extern char **environ;.

    – R.. GitHub DEJA DE AYUDAR A ICE

    13 de agosto de 2010 a las 4:05

  • Como Jonathan respondió a uno de mis otros comentarios, a partir de POSIX 2008 es ahora parte de unistd.h.

    – R.. GitHub DEJA DE AYUDAR A ICE

    13 de agosto de 2010 a las 6:23

  • while (*envp) printf(“%s\n”, *envp++); guarda la variable de índice.

    –Rhys Ulerich

    26 de marzo de 2012 a las 13:11


  • Descubrí esto al leer accidentalmente más allá del final de argv. Aparentemente está ahí incluso si no tiene ese parámetro en la fuente.

    – Dragón pensativo

    9 mayo 2014 a las 13:36

Hay una demostración en el libro “La interfaz de programación de Linux” en la página 127.

Listado 6-3: Visualización del entorno del proceso ––––––––––––––––––––––––––––––––––––––––––––– –––––––proc/display_env.c

#include "tlpi_hdr.h"

extern char **environ;

int
main(int argc, char *argv[])
{
    char **ep;
    for (ep = environ; *ep != NULL; ep++)
        puts(*ep);
    exit(EXIT_SUCCESS);
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad