Communication avec l’environnement

Slides:



Advertisements
Présentations similaires
Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Structure de base des programmes en C.
Advertisements

Premier programme en C :
La boucle for : init7.c et init71.c
Les fonctions A quoi ça sert ?
Rappels C.
Formation universitaire à .NET: Introduction à C#
C++ 6ème cours Patrick Reuter maître de conférences
Synchronisation des processus père - fils
C.
Paramètres et pointeurs
FLSI602 Génie Informatique et Réseaux
Common Gateway Interface
Principes de programmation (suite)
2ième Classe (Mercredi, 13 Octobre) C++ Intro CSI2572.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Langage C Révision.
Structures de données linéaires
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
RESUMES Module II1 SOMMAIRE CYCLE 1 : Saisir – Afficher – Données
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Points importants de la semaine Le préprocesseur. La conversion de types. Les fonctions.
Instruction sélective switch-case Instruction répétitive do-while For
Chapitre XI Gestion des erreurs et exceptions. 2 La gestion des erreurs et exceptions De nombreux problèmes peuvent survenir pendant lexécution dun programme:
IFT 6800 Atelier en Technologies d’information
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 6. Gestion des erreurs et des exceptions : Fonctionnement.
Plan troisième cours Instruction sélective Instruction répétitive
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
La librairie assert.h.
L’essentiel du langage C
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
La notion de type revisitée en POO
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
SIF-1053 Architecture des ordinateurs
GESTION ET TRAITEMENT DES ERREURS
Argc et argv Utilisation des paramètres de la ligne de commande.
Créer des packages.
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
Tutorat en bio-informatique
Introduction au langage C Fonctions et Procédures
Les types composés Les enregistrements.
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
8PRO100 Éléments de programmation Les pointeurs de caractères.
Le Préprocesseur. Sujets abordés: Préprocesseur –Qu’est ce? –Qu’est ce qu’une directive? Les macros –Les définir, les redéfinir, les dé-définir –Les macros.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Signaux Il s'agit de messages asynchrones envoyés à un processus
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Scripts et fonctions Instructions de contrôle
PRO-1027 Programmation Scientifique en C
Langage de Programmation Orientée Objet : C++
Chapitre 9 Les caractères.
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
C++ BY AURÉLIEN MODULO MARION. PLAN DES TROIS PRÉSENTATIONS C++ avancé C++ orienté objet Bases de C++
1 UNIX AVANCE Yves PAGNOTTE – Janvier – LES PROCESSUS SOUS UNIX.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

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 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

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

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.

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

Exemple simple int main(int argc, char *argv[]){ int i; printf(``nom de prog: %s\n``, argv[0]); if(argc1) for(i=1;iargc;i++) printf(``arg num %d: %s\n``,i,argv[i]); else puts(``pas d’arguments``); }

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);

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

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)

int atexit(void (*fct)(void)) 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

Exemple #include stdlib.c … void myExit(){ puts(``I am not dead!``); } Int main(void){ atexit(myExit); exit(EXIT_SUCCESS);

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

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)

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

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); }

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)

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 !

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

#include signal.h void 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);

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

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

Remarque La 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); }

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.h extern 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

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.h void perror(const char *s); la fonction strerror retourne le texte du message d’erreur correspondant à un numéro #include string.h char *strerror(int errnum);

Traitement des erreurs, branchements non locaux #include setjmp.h int 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

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.

… #include setjmp.h jmp_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));