¿Hay alguna manera de enumerar las variables de entorno y recuperar valores usando C?
Lista de variables de entorno con C en UNIX
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,__environ
tambié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 esunion 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);
}