Programmation système I Les entrées/sorties



Documents pareils
Le système de gestion des fichiers, les entrées/sorties.

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Programmation impérative

Les fichiers. Chapitre 4

Le langage C. Séance n 4

Programmation système de commandes en C

Le prototype de la fonction main()

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmation système en C/C++

Introduction au langage C

Algorithmique et Programmation, IMA

Rappels Entrées -Sorties

Initiation. àl algorithmique et à la programmation. en C

Bases de programmation. Cours 5. Structurer les données

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours de Système : Gestion de Fichiers

Cours 6 : Tubes anonymes et nommés

Programmation en langage C

SUPPORT DE COURS. Langage C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Compression de Données - Algorithme de Huffman Document de Conception

3IS - Système d'exploitation linux - Programmation système

COMPARAISONDESLANGAGESC, C++, JAVA ET

Outils pour la pratique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Structure d un programme

Cours 14 Les fichiers

Cours de C/C++ par la pratique. Hugues Talbot

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation en langage C Eléments de syntaxe

GESTION DES FICHIERS C/UNIX

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

I00 Éléments d architecture

La mémoire. Un ordinateur. L'octet. Le bit

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Les structures. Chapitre 3

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation C. J.-F. Lalande. 15 novembre 2012

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de programmation avancée. Le langage C. Université du Luxembourg

Gestion des fichiers. Telecom-ParisTech BCI Informatique

Pensez à vous inscrire... si ce n est pas encore fait

Arguments d un programme

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Langage Éric Guérin 5 octobre 2010

Chapitre 1 : La gestion dynamique de la mémoire

Langages et Concepts de Programmation Introduction à la programmation en langage C

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Les débordements de tampons et les vulnérabilités de chaîne de format 1

INFO-F-404 : Techniques avancées de systèmes d exploitation

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Cours Programmation Système

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP1 - Prise en main de l environnement Unix.

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

INF 104 (SELC) Introduction au langage C

Les chaînes de caractères

Flux de données Lecture/Ecriture Fichiers

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Compléments de documentation Scilab : affichage de texte et formatage de nombres


1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Programmation Classique en langage C

Cours d initiation à la programmation en C++ Johann Cuenin

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

I. Introduction aux fonctions : les fonctions standards

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Conventions d écriture et outils de mise au point

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Logiciel de base. Première année ENSIMAG

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Cours Langage C/C++ Programmation modulaire

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

UE C avancé cours 1: introduction et révisions

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Manuel d'installation

Plan du cours. Historique du langage Nouveautés de Java 7

Simulation d un système de paiement par carte bancaire

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Chap III : Les tableaux

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Analyse de sécurité de logiciels système par typage statique

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

ALGORITHMIQUE ET PROGRAMMATION En C

IV- Comment fonctionne un ordinateur?

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Transcription:

Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée

Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les systèmes d exploitations ont des mécanismes/fonctions d entrées sorties, les langages de programmation aussi. Dans le langage C, la plupart de ces fonctionnalités se situent dans la librairie <stdio.h>. (stdio : standard input output). Sans entrées/sorties, il est impossible de produire des programmes évolués ayant de grands impacts sur l environnement, le système et la mémoire.

Les flux d informations Toutes interactions avec l environnement et la mémoire (et leurs modifications) nécessite de récupérer ou de constituer un flux d informations. Flux classiques : Texte tapé au clavier (entrée) Mouvement de la souris et clic (entrée) Fichiers sur le disque dur (entrée/sortie) Position de la souris sur l écran (entrée/sortie) Texte affiché sur l écran (sortie) Réseau (entrée/sortie) Webcam (entrée)...

Les fichiers dans le langage C Il est possible de manipuler (créer / lire / écrire / détruire) des fichiers du disque dur via des fonctions d Entrées/Sorties de la librairie <stdio.h>. Dans le langage C, les fichiers sont manipulables via un pointeur sur une structure FILE. Procédé de manipulation de fichier: Ouverture du fichier, constitution de l objet (FILE *) et placement du pointeur. Fonctions d Entrées/Sorties du langage C pour modifier des caractères sur le pointeur et déplacer ce pointeur dans le fichier ouvert. Fermeture du fichier. Le dernier caractère d un fichier ouvert est EOF pour (End Of File).

Ouverture d un fichier: fopen Avant toute opération sur un fichier, il est nécessaire d obtenir un pointeur de type FILE *. FILE *fopen(const char *path, const char *mode); -path contient l adresse du fichier à ouvrir, -mode précise le mode d ouverture. "r": mode lecture, pointeur au début "w": mode écriture, pointeur au début, création du fichier si non existant, effacement sinon. (Chevron UNIX >) "r+": mode lecture-écriture, pointeur au début "w+": mode lecture-écriture, pointeur au début, création du fichier si non existant, effacement sinon. "a": mode écriture, pointeur à la fin, création du fichier si non existant. (Chevron UNIX >>) "a+": mode lecture-écriture, pointeur à la fin, création du fichier si non existant.

Fermeture d un fichier: fclose Une fois les modifications terminées, il convient de fermer les fichiers ouverts. int fclose(file *stream); retourne 0 en cas de succès et EOF sinon. Réouverture d un fichier: freopen Ré-ouvre un fichier en fermant l instance précédemment ouverte. FILE *freopen(const char *path, const char *mode, FILE *stream); A l origine, cette fonction est conçue pour permettre les redirections. On l utilisera rarement en pratique mais son recours est parfois contraint.

Les flux standards Dans le langage C et pour UNIX (programmé en C), il existe des flux standards qui se comportent comme des fichiers pour lesquels l utilisateur n a pas à se soucier de l ouverture et fermeture. stdin: (standard input) est l entrée standard. Tout caractère tapé au clavier durant l exécution d un programme se retrouve dans ce flux. stdout: (standard output) est la sortie standard. Tout caractère écrit dans ce flux sera affiché dans la console lors de l exécution d un programme. ATTENTION A LA BUFFERISATION. stderr: (standard error) est la sortie d erreur standard. Les fonctions d Entrées/Sorties du langage C opérant sur les fichiers et flux standards sont très liées. (printf - fprintf, scanf - fscanf,...).

Fonctions d Entrées/Sorties du langage C Les fonctions d entrées/sorties servent à écrire et récupérer des données dans les fichiers ouverts et les flux standards. int i; char c;... fscanf fprintf scanf printf fichier1 mode lecture fichier2 mode écriture stdin stdout Les fonctions primitives systèmes sont très difficiles à utiliser (open, close, read, write). Notamment, elles ne font que de la lecture octet par octet (8 bits). On utilisera les fonctions E/S formatées de <stdio.h>.

scanf : lecture formatée sur l entrée standard int scanf(const char *format,...); On remplace les... par une liste d adresses de conteneurs mémoires adaptés. Si on a une variable int i, l adresse &i de i est un conteneur mémoire adapté à la lecture d un entier. Type Lettre int %d long %ld float - double %f - %lf char %c string (char*) %s 1 char nom [ 5 0 ] ; 2 i n t age ; 3 p r i n t f ( Saisissez v o t r e nom, un espace, puis v o t r e age ) ; 4 scanf ( %s %d, nom, &age ) ; scanf retourne le nombre de variables affectées par la saisie, cela permet de vérifier le bon déroulement de la saisie.

printf : écriture formatée sur la sortie standard int printf(const char *format,...); On remplace les... par une liste de variables adaptées aux différents types apparaissant dans le format. Encore une fois, il faut respecté l ordre de lecture de gauche à droite. Le texte formaté avec les bonnes substitutions est ensuite affiché à l écran (modulo la bufferisation). 1 f l o a t t =37.12; 2 3 p r i n t f ( La temperature de %s est %f, Martin, f ) ; En cas de succès, printf retourne le nombre de caractères écrits sur la sortie standard (sans compter le caractère de fin de chaîne).

fscanf : lecture formatée sur un flux int fscanf(file *stream, const char *format,...); On remplace les... par une liste d adresses de conteneurs mémoires adaptés. On récupère ainsi des données dans le flux qui se place en valeur des adresses de variables données. 1 char nom [ 8 0 ] ; 2 i n t age ; 3 FILE f i c h i e r e n t r e e ; 4 5 f i c h i e r e n t r e e = fopen ( nom age. t x t, r ) ; 6 f s c a n f ( f i c h i e r e n t r e e, %s %d, nom, & f ) ; fscanf retourne le nombre de variables affectées par la saisie, cela permet de vérifier le bon déroulement de la saisie. Les flux standards se comportent comme des fichiers ouvert, ainsi : scanf(format,...) est équivalent à fscanf(stdin, format,...).

fprintf : écriture formatée sur un flux int fprintf(file *stream, const char *format,...); On remplace les... par une liste de variables adaptées aux différents types apparaissant dans le format. Encore une fois, il faut respecté l ordre de lecture de gauche à droite. Le texte formaté avec les bonnes substitutions est ensuite écrit sur le flux. 1 i n t age=12; 2 FILE f i c h i e r s o r t i e ; 3 4 f i c h i e r s o r t i e = fopen ( nom age. t x t, w ) ; 5 f s c a n f ( f i c h i e r s o r t i e, %s %d, Martin, age ) ; En cas de succès, fprintf retourne le nombre de caractères écrits sur le flux (sans compter le caractère de fin de chaîne). printf(format,...) est équivalent à fprintf(stdout, format,...).

Il existe de nombreuse autre fonctions d Entrées/Sorties. Lorsque l on ne connaît pas/plus une fonction foo en langage C, LE SEUL RÉFLEXE: on tape man 3 foo dans un terminal. Autre fonctions: fgetc, fgets, getc, getchar, gets, ungetc, fputc, fputs, putc, putchar, puts,... man 3 fgetc GETS(3) Linux Programmer s Manual GETS(3) NAME fgetc, fgets, getc, getchar, gets, ungetc - input of characters and strings SYNOPSIS #include <stdio.h> int fgetc(file *stream);...

Soyez astucieux et perspicaces Les noms de fonctions n ont pas été choisis au hasard. print-f : écrire, format f-scan-f : flux, analyser, format f-get-c : flux, obtenir, caractère put-char : placer, caractère f-put-s : flux, placer, chaîne de caractères Lorsque le nom ne commence pas par un f, la fonction affecte les flux standards, sinon elle aura un flux parmi ses arguments. En fin de nom, c et char désigne des caractères, s désigne une chaîne de caractères, f que la fonction peut prendre des écritures formatées (types différents).

Des paramètres dans la fonction main Voici le prototype standard d un main acceptant des arguments: int main(int argc, char* argv[]) argc est un entier, il donne le nombre d arguments passés à l exécutable (en comptant le nom de l exécutable comme premier argument). argv est un tableau de chaînes de caractères. argv[0]: le nom de l exécutable (dépend du nom donné à la compilation). argv[1]: le nom du premier argument. argv[2]: le nom du second argument.... Similarité avec le langage du bash: $# se comporte comme argc $0 se comporte comme argv[0] $1 se comporte comme argv[1]... (et tout est, a priori, chaînes de caractères)

Pour le programme suivant : test.c 1 #include <s t d i o. h> 2 3 i n t main ( i n t argc, char argv [ ] ) { 4 i n t i ; 5 6 for ( i =0 ; i <argc ; i ++){ 7 p r i n t f ( %s\n, argv [ i ] ) ; 8 } 9 return 0; 10 } nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$./test fich1.txt fich2.txt 23./test fich1.txt fich2.txt 23

Les arguments des exécutables passés par la console sont des chaînes de caractères. Toutefois, le langage C possède des fonctions de conversions entre ces types. int atoi(const char *nptr); retourne un entier à partir d une chaîne de caractères. 1 #include <s t d i o. h> 2 #include < s t d l i b. h> 3 4 i n t main ( void ) { 5 char nombre= 12543 ; 6 7 p r i n t f ( %d\n, a t o i ( nombre ) ) ; 8 return 0; 9 } nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$./test 12543

Comment alors faire un exécutable en console qui attend des entiers en arguments et retourne la somme de ces derniers. 1 #include <s t d i o. h> 2 #include < s t d l i b. h> 3 4 i n t main ( i n t argc, char argv [ ] ) { 5 i n t i,somme=0; 6 7 for ( i =1 ; i <argc ; i ++){ 8 somme += a t o i ( argv [ i ] ) ; 9 } 10 p r i n t f ( %d\n, somme ) ; 11 return 0; 12 } nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$./test 0 nicolas@lancelot: /test$./test 1 2 3 nicolas@lancelot: /test$./test 1 2 5 5 13 nicolas@lancelot: /test$./test foo bla 0

L œuf ou la poule, UNIX ou le langage C? Le système d exploitation UNIX et le langage C ont été conçu de manière relativement conjointe. Notamment, les flux standards (stdin, stdout, stderr) SONT LES MÊMES! Un exécutable compilé à partir de source écrite en C bien programmé peut s enchaîner dans des pipes UNIX à volonté. conséquences: Toutes les données récupérées sur l entrée standard (scanf, getchar,...) peuvent en fait être envoyé au programme via un chevron entrant < d UNIX ou un pipe.

1 #include <s t d i o. h> 2 3 i n t main ( void ) { 4 char nom [ 5 0 ] ; 5 i n t age ; 6 7 p r i n t f ( Donner v o t r e nom et v o t r e age! \ n ) ; 8 scanf ( %s %d, nom, &age ) ; 9 p r i n t f ( Ok, vous etes %s et vous avez %d ans\n, nom, age ) ; 10 return 0; 11 } nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$ echo "Dupont 45" Dupont 45 nicolas@lancelot: /test$ echo "Dupont 45"./test Donner votre nom et votre age! Ok, vous etes Dupont et vous avez 45 ans nicolas@lancelot: /test$./test < nom_age.txt Donner votre nom et votre age! Ok, vous etes Durant et vous avez 78 ans

1 #include <s t d i o. h> 2 3 i n t main ( void ) { 4 i n t c=getchar ( ) ; 5 6 \ Recopiage de l entree standard sur l a s o r t i e standard \ 7 while ( c!= EOF) { 8 putchar ( c ) ; 9 c = getchar ( ) ; 10 } 11 return 0; 12 } nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$ echo "pouet fou bla" > fichier nicolas@lancelot: /test$ echo "une seconde ligne" >> fichier nicolas@lancelot: /test$./test < fichier pouet fou bla une seconde ligne nicolas@lancelot: /test$./test < fichier./test pouet fou bla une seconde ligne

Bufferisation La sortie standard est bufferisée: Les fonctions d Entrées/Sortie de <stdio.h> n envoient pas directement les éléments sur l écran. UNIX incite à l enchaînement de commandes ou exécutables via des pipes. Mais la communication entre les processus a un coût. Surtout si l on perd son temps à communiquer sans arrêt des messages tout petits. printf écrit sur le buffer de la sortie standard (de taille 8192 Octets par défaut) et une fois le buffer plein (ou un retour à ligne, ou un flush, ou...), on sollicite le processus d affichage à l écran. Note: La sortie d erreur n est pas bufferisé et affiche les caractères dès l ajout dans le flux.

1 #include <s t d i o. h> 2 3 i n t main ( void ) { 4 char nom= Jean ; 5 6 p r i n t f ( Ou est l e r r e u r de segmentation ) ; 7 nom[ 3 4 ] = 123; 8 return 0; 9 } Ce programme donne le comportement suivant nicolas@lancelot: /test$ gcc -o test test.c -Wall -ansi nicolas@lancelot: /test$./test Erreur de segmentation (core dumped) Où est passé le printf? l erreur de segmentation se trouve avant?

Solution 1: 1 #include <s t d i o. h> 2 3 i n t main ( void ) { 4 char nom= Jean ; 5 6 / Un saut de l i g n e f o r c e l a vidange du b u f f e r / 7 p r i n t f ( Ou est l e r r e u r de segmentation \n ) ; 8 nom[ 3 4 ] = 123; 9 return 0; 10 } Solution 2: 1 #include <s t d i o. h> 2 3 i n t main ( void ) { 4 char nom= Jean ; 5 6 / Drapeau de debogage sur l a s o r t i e d e r r e u r / 7 f p r i n t f ( s t d e r r, Ou est l e r r e u r de segmentation ) ; 8 nom[ 3 4 ] = 123; 9 return 0; 10 }