Est de type char *envp[] en tant que troisième argument de main() portable
Afin d'obtenir une variable d'environnement dans un C
programme, on peut utiliser les éléments suivants:
getenv()
extern char **environ;
Mais d'autres que ceux susmentionnés, est à l'aide de char *envp[]
comme un troisième argument à main()
pour obtenir les variables d'environnement considéré comme faisant partie de la norme?
#include <stdio.h>
int main(int argc, char *argv[], char *envp[])
{
while(*envp)
printf("%s\n",*envp++);
}
Est char *envp[]
portable?
Vous devez vous connecter pour publier un commentaire.
La fonction
getenv
est le seul spécifié par la norme. La fonctionputenv
, et l'externeenviron
sont POSIX spécifiques.MODIFIER
La
main
paramètreenvp
n'est pas spécifié par POSIX, mais est largement pris en charge.Il n'est pas portable.
*envp[]
est un UNIX traditionnel chose, et non tous les systèmes UNIX modernes en œuvre.Également comme une note de côté, vous pourriez avoir accès envp en faisant un pointeur traversée de plus de
*argv[]
, débordant...mais je ne pense pas que qui peut être considéré comme sûr de programmation. Si vous prenez un regard sur les processus de la mémoire de la carte, vous verrez queenvp[]
est juste au-dessus deargv[]
.auxv
... 😉elf.h
pour les macros début avecAT_
. Certaines des choses les plus intéressantes sontAT_SECURE
,AT_RANDOM
,AT_EXECFN
,AT_HWCAP
, et l'uid/gid ceux. Sinon, ils sont le plus souvent de l'intérêt pour l'éditeur de liens dynamique et de la libc code d'initialisation. Le format deauxv
est paires de système de mot de la taille des entiers, dont le premier est l'un desAT_
constantes (une balise) et le second est la valeur associée à cette balise (peut-être un pointeur, en fonction de la balise).char **find = argv, **envp; while(*find) find++; envp = find + 1;
Probablement un comportement indéfini depuis un OS n'est pas garanti à mettre de l'environnement trucs après argv dernier arg...La Norme décrit deux formats pour
main
(voir 5.1.2.2.1 dans le Standard C99 (pdf))a)
int main(void)
et
b)
int main(int argc, char **argv)
ou équivalentet il permet des implémentations de définir d'autres formats (ce qui peut permettre à un 3ème argument)
c) ou dans certains autres de la mise en œuvre-définis.
main
, mais ces deux sont les seuls garantis d'être présent dans toutes hébergé mise en œuvre.Le 3ème argument est valide dans Microsoft C et le compilateur GNU GCC:
Visual Studio 2015: les Arguments principaux
GNU C Programmation Tutoriel: les variables d'Environnement