Communication avec l’environnement

28
Communication avec l’environnement

description

Communication avec l’environnement. Contenu. Arguments de la ligne de commande Terminaison d’un programme Communication avec l’environnement Les signaux Gestion d’erreur. Les arguments reçus par la fonction main. - PowerPoint PPT Presentation

Transcript of Communication avec l’environnement

Page 1: Communication avec l’environnement

Communication avec l’environnement

Page 2: Communication avec l’environnement

Contenu

• Arguments de la ligne de commande• Terminaison d’un programme• Communication avec l’environnement• Les signaux• Gestion d’erreur

Page 3: Communication avec l’environnement

Les arguments reçus par la fonction main

• La norme prévoit qu’un programme exécuté sous le contrôle d’un environnement débute par la fonction main

• Celle-ci peut disposer d’arguments lui permettant de recueillir des informations en provenance de l’environnement

Page 4: Communication avec l’environnement

L’en-tête de la fonction main• La fonction main ne dispose pas de

prototype et n’est pas déclarée. • Mais son en-tête ne peut s’écrire que sous

ces deux formes:– int main(void)

{ int i;….,return(i);}– int main(int argc, char *argv[ ])

{int i;….,return(i);} • Les en-têtes «main()» et «int main()» sont

hors norme mais ne provoquent qu’un warning

Page 5: Communication avec l’environnement

Récupération des arguments

• argc (argument count) donne le nombre d’arguments de la ligne de commande qui a appelé le programme (nom du prog. compris!)

• argv (argument vector) est un pointeur sur un tableau de chaînes de caractères qui contient les arguments, à raison de 1 par chaîne.

Page 6: Communication avec l’environnement

Exemple

Marieulle[123]>monProg –h –l test.txt argc = 4 et argv

monProg\0

-h\0

-l\0

test.txt\0

Page 7: Communication avec l’environnement

Exemple simpleint main(int argc, char *argv[]){

int i;printf(``nom de prog: %s\n``, argv[0]);if(argc1)

for(i=1;iargc;i++) printf(``arg num %d: %s\

n``,i,argv[i]);else

puts(``pas d’arguments``);}

Page 8: Communication avec l’environnement

int main(int argc, char *argv[ ]){int optionA=0, optionB=0;char nomFichier[100];while(--argc 0 && (*++argv)[0]==`-`){ while(c= *++argv[0]){ switch(c){ case `a`: optionA=1; break; case `b`: optionB=1; break; default: printf(``option interdite %c\n``,c); argc = 0; break;

} } }

if(argc != 1) puts(``Usage: monProg -x –v fichier``);else strcpy(nomFichier,*argv);

}

Page 9: Communication avec l’environnement

Terminaison d’un programme• Un programme peut être interrompu d’office par

le SE en cas de rencontre d’une situation dite ``d’exception``:– Tentative d’exécution d’une instruction inexistante– Adresse invalide– Division par zéro…– Rencontre d’un abort dans le programme

• Sortie normale dans les situations:– Appel de exit de n’importe quel point du programme– Rencontre d’un return dans la fonction main– Fin naturel de la fonction main

Page 10: Communication avec l’environnement

La fonction exit

L’appel à la fonction exit provoque • la fermeture de tout les fichiers encore ouverts• La destruction des fichiers créés par tmpfile • La fin du programme• Transmission à l’environnement de son unique

argument entier. La norme prévoit deux valeurs :– EXIT_SUCCESS (généralement 0)– EXIT_FAILURE (généralement non nul)

Page 11: Communication avec l’environnement

La fonction atexit

int atexit(void (*fct)(void))• Permet d’enregistrer les noms de

fonctions de son choix qui seront appelés avant l’arrêt (normal) de l’exécution par exit

• Ces fonctions seront appelés – dans l’ordre inverse de leur enregistrement– Avant la fermeture des fichiers encore ouverts– Avant la destruction des fichiers temporaires

Page 12: Communication avec l’environnement

Exemple#include stdlib.c…void myExit(){

puts(``I am not dead!``);}…Int main(void){…

atexit(myExit);…

exit(EXIT_SUCCESS);}

Page 13: Communication avec l’environnement

L’instruction return dans la fonction main

• L’instruction return peut comporter une expression mais ce n’est pas une obligation, même quand l’en-tête de la fonction précise une valeur de retour

• Dans main l’expression est de type numérique (int)

• Equivalent à un appel à exit

Page 14: Communication avec l’environnement

Communication avec l’environnement

La norme propose, sous forme de fonctions standard, deux outils permettant:– De recueillir certaines info relatives à l’état de

l’environnement (getenv)– D’envoyer une commande à l’environnement

(system)

Page 15: Communication avec l’environnement

La fonction getenv• L’environnement est défini par un certain

nombre de paramètres de type chaîne de caractères.

• Chaque paramètre est lui-même repéré par un nom prédéfini (une chaîne de caractère) dépendant de l’implémentation.

• La fonction getenv permet de connaître l’adresse d’une chaîne correspondant à la valeur d’un paramètre de nom donné.

char *getenv(const char *nomParam);

Le programme ne devra pas modifier la chaîne de retour

Page 16: Communication avec l’environnement

Exemple#include stdlib.c#include stdio.h

int main(void){char *terminal = getenv(``TERM``);puts(``le terminal est: ``);if(terminal == NULL)

puts(``inconnu``);else

printf(``un %s\n``,terminal);exit(EXIT_SUCCESS);

}

Page 17: Communication avec l’environnement

Les signaux

• Norme assez flou permet de mettre en place un mécanisme de gestion des exceptions et des interruptions: transmission de signaux.

• Un signal est repéré par un numéro entier.• Il est émis (déclenché/levé) par une fonction

(appel à raise) ou un mécanisme (rapport d’erreur du SE).

• Provoque un certain traitement. (pour chaque signal prévu par l’implémentation, il y a un traitement par défaut qui peut être détourné par la fonction signal)

Page 18: Communication avec l’environnement

Remarques

• La norme prévoit un certain nombre de valeurs prédéfinis de signaux (tentative de division par zéro…)

• Mais n’impose pas à l’environnement de déclencher le signal correspondant lorsque l’exception est détectée !

Page 19: Communication avec l’environnement

La fonction signal

void ( *signal( int numsig, void (*f)(int) ) )(int)• numsig est le numéro du signal concerné• f : traitement à associer au signal

– Valeur prédéfinie (SIG_DFL ou SIG_IGN)– Fonction recevant un int sans retour

• retour: – SIG_ERR en cas d’erreur– Valeur de f relative au dernier appel de signal

pour ce même numéro

Page 20: Communication avec l’environnement

#include signal.hvoid fsig(int);int main(void){

double x=1, y=0, z;signal(SIGPFE,fsig);z=x/y;puts(``y a rien là?``);

}void fsig(int n){

printf(``division par zéro, n=%d``,n);exit(EXIT_FAILURE);

}

Page 21: Communication avec l’environnement

Les numéros de signaux prédéfinis

• SIGABRT fin anormale (éventuellement lancé par abort) (fct de trait. du signal ne doit pas contenir de fonction standard )

• SIGFPE opération arithmétique incorrecte• SIGILL instruction invalide• SIGINT réception d’un signal interactif• SIGSEV accès mémoire invalide• SIGTERM demande d’arrêt envoyé au

programme

Page 22: Communication avec l’environnement

La fonction raise

int raise(int numsig);Provoque l’emission su signal numsig.

Page 23: Communication avec l’environnement

RemarqueLa norme prévoit que dès qu’on a traité un signal

par une fonction de son choix, les déclenchements ultérieurs de ce même signal ne seront plus ``vus`` par le programme.

Pour parvenir à traiter de nouveau le signal, il suffit de prévoir un appel approprié de signal à l’intérieur de la fonction de traitement du signal elle-même.

void fsig(int n){puts(``appel à fsig``);signal(n, fsig);

}

Page 24: Communication avec l’environnement

Gestion d’erreur• La plupart des fonctions du système peuvent

échouer pour diverse raisons.• On peut alors examiner la pseudo-variable errno

pour déterminer plus précisément la cause de l’échec et agir en conséquence.

#include stdio.hextern int errno;…• Sa valeur est initialisée à zéro • Elle peut être modifiée par n’importe quelle

fonction, même en dehors d’une situation d’erreur

Page 25: Communication avec l’environnement

perror et strerror• La fonction perror imprime sur la sortie d’erreur

standard un message décrivant la dernière erreur qui s’est produite, précédé d’une chaîne de caractère.#include stdio.hvoid perror(const char *s);

• la fonction strerror retourne le texte du message d’erreur correspondant à un numéro#include string.hchar *strerror(int errnum);

Page 26: Communication avec l’environnement

Traitement des erreurs, branchements non locaux

#include setjmp.hint setjmp(jmp_buf env);void longjmp(jmp_buf env, int val);

• Ces deux fonctions permettent de réaliser un branchement d’une fonction à une autre (la première doit avoir été appelée par la seconde).

• Moyen de gestion d’erreur par exceptions

Page 27: Communication avec l’environnement

setjmp et longjmp• setjmp permet de sauver

l’environnement (contexte d’exécution) dans le variable tampon env. et retourne 0 sauf erreur

• longjmp rétablit le dernier environnement qui a été sauvé dans env par setjmp : le programme continue à l’endroit du setjmp comme si celui-ci avait retourné la valeur val.

Page 28: Communication avec l’environnement

…#include setjmp.hjmp_buf env;extern long fact(long x);long comb(long k, long n){

if(k 0 || n 1|| k n )longjmp(env,2);

return(fact(n)/(fact(k)*fact(n-k)));}int main(void){

if(setjmp(env)){fprintf(stderror, ``erreur de calcul!\n``);return(EXIT_FAILURE);

}printf(``%ld\n``,comb(3,2));

}