
FAQ CConsultez toutes les FAQ
Nombre d'auteurs : 28, nombre de questions : 175, création le 11 janvier 2013
Sommaire→Divers→Communication avec l'environnementPour accéder aux paramètres de la ligne de commandes, il suffit de déclarer la fonction main() de la façon suivante :
int main(int argc, char * argv[])
{
return 0;
}
- argc est le nombre de paramètres constituant la ligne de commande.
- argv est un tableau de pointeurs sur des chaînes de caractères qui représentent les paramètres de la ligne de commande.
- argv[0] représente le "nom du programme" et argv[1] à argv[argc - 1] les paramètres passés au programme. argv[argc] vaut toujours NULL.
Attention, le "nom du programme" ne signifie pas le nom de l'exécutable. argv[0] peut pointer vers :
- le nom de l'exécutable
- le chemin complet de l'exécutable
- une chaîne vide
- autre chose !
Mais il est garanti que le contenu de argv[0] ne sera jamais NULL (ce qui implique que argc vaut toujours au moins 1 ...).
La fonction getenv() permet de lire la valeur d'une variable d'environnement.
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("HOME : %s\n", getenv("HOME"));
printf("HOMEPATH : %s\n", getenv("HOMEPATH"));
return 0;
}
Normalement la première existe sous Linux et la seconde sous Windows. La fonction retourne NULL si la variable n'existe pas.
La fonction putenv(), introduite par POSIX, permet quant à elle de créer ou de modifier une variable d'environnement.
Ces fonctions sont toutes déclarées dans stdlib.h.
Pour avoir la liste des variables d'environnement, vous pouvez regarder l'entrée Comment récupérer la liste des variables d'environnement ?
Il existe, sur certains compilateurs, une forme de déclaration de la fonction main() qui donne accès aux variables d'environnement via un de ses paramètres.
int main(int argc, char * argv[], char * envp[])
{
return 0;
}
envp pointe sur un tableau de pointeurs vers des chaînes de caractères, chacune représentant une variable d'environnement sous la forme : "nom=valeur", où nom correspond au nom de la variable et valeur à sa valeur. Le dernier élément du tableau pointé par envp contient NULL. Voici un petit programme qui liste les variables en utilisant le troisième argument de main :
#include <stdio.h>
int main(int argc, char * argv[], char * envp[])
{
unsigned short i;
for(i = 0; envp[i] != NULL; i++)
{
printf("%s\n", envp[i]);
}
return 0;
}
Pour lire juste une variable d'environnement, il est plus simple de passer par Comment récupérer une variable d'environnement ?
Lien : Comment accéder aux paramètres de la ligne de commandes ?
Cette fonction, déclarée dans stdlib.h, permet de demander au système d'exécuter la commande passée en argument, comme si on l'avait vraiment tapée
depuis l'invite des commandes. system passe en fait la commande à l'interpréteur de commandes du système, le programme qui va réellement exécuter la commande.
Si ce dernier est absent, la commande sera donc tout simplement ignorée.
La manière dont un programme récupère le chemin vers l'interpréteur de commandes (généralement en vue de lui passer une commande ...) est bien entendu dépendante du système.
Sous DOS et Windows par exemple, ce chemin est renseigné par la variable d'environnement COMSPEC. Un programme lit donc la valeur de cette variable pour connaître le chemin vers l'interpréteur
de commandes (qui est normalement command.com sous DOS et cmd.exe sous Windows NT). Ainsi, lorsqu'un programme est lancé par émulation (par exemple un programme MS-DOS lancé sous Windows NT),
system pourra ne plus fonctionner car l'interpérteur de commandes renseigné par l'émulateur peut par exemple tout simplement être introuvable.
En fait, la norme ne précise même pas la manière dont comment la fonction system doit traiter la chaîne qui lui est passée. Ainsi, dans de nombreux environnements (incluant DOS, Windows et UNIX),
si la chaîne commence par le nom ou le chemin d'un fichier exécutable, system va lancer le programme sans invoquer l'interpréteur de commandes.
Il est possible de lancer une commande du système et de récupérer, via un pointeur de fichier (FILE *), le résultat de cette commande grâce à la fonction popen introduite par POSIX. Cette fonction s'utilise de manière similaire à fopen mais attend une commande à exécuter à la place d'un nom de fichier.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * pp;
char buf[256];
if ((pp = popen("ls -l", "r")) == NULL)
{
perror("popen");
exit(EXIT_FAILURE);
}
while (fgets(buf, sizeof buf, pp))
fputs(buf, stdout);
pclose(pp);
return 0;
}



