from - Es char*envp[] como tercer argumento para main() portable
read from command line c (4)
Para obtener una variable de entorno en un programa C
, uno podría usar lo siguiente:
-
getenv()
-
extern char **environ;
Pero, aparte de lo mencionado anteriormente, ¿está utilizando char *envp[]
como tercer argumento para main()
para obtener las variables de entorno consideradas parte del estándar?
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s/n",*envp++);
}
¿Es char *envp[]
portátil?
El estándar describe dos formatos para main
(ver 5.1.2.2.1 en el estándar C99 (pdf) )
a) int main(void)
y
b) int main(int argc, char **argv)
o equivalente
y permite a las implementaciones definir otros formatos (que pueden permitir un tercer argumento)
c) o de alguna otra manera definida por la implementación.
El tercer argumento es válido en Microsoft C y GNU GCC:
La función getenv
es la única especificada por el estándar C. La función putenv
y el entorno externo son específicos de POSIX.
EDITAR
El parámetro main
envp
no está especificado por POSIX, pero es ampliamente compatible.
Un método alternativo para acceder a la lista de entornos es declarar un tercer argumento para la función main ():
int main(int argc, char *argv[], char *envp[])
Este argumento se puede tratar de la misma manera que el entorno, con la diferencia de que su alcance es local a main (). Aunque esta característica se implementa ampliamente en sistemas UNIX, se debe evitar su uso ya que, además de la limitación del alcance, no se especifica en SUSv3 .
No es portátil. *envp[]
es una cosa tradicional de UNIX, y no todos los sistemas UNIX modernos lo implementan.
También como nota al margen, puede acceder a envp haciendo un recorrido de puntero sobre *argv[]
, desbordando ... pero no creo que pueda considerarse una programación segura . Si echas un vistazo al mapa de memoria de proceso, verás que envp[]
está justo encima de argv[]
.