• Aucun résultat trouvé

Programmation syst`eme I Les entr´ees/sorties

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation syst`eme I Les entr´ees/sorties"

Copied!
24
0
0

Texte intégral

(1)

Programmation syst `eme I Les entr ´ees/sorties

DUT 1reann ´ee

Universit ´e de Marne La vall ´ee

(2)

Les entr ´ees-sorties : E/O

Entr ´ees/Sorties :Op ´erations d’ ´echanges d’informations dans un syst `eme informatique.

Les syst `emes d’exploitations ont des m ´ecanismes/fonctions d’entr ´ees sorties, les langages de programmation aussi. Dans le langage C, la plupart de ces fonctionnalit ´es se situent dans la librairie<stdio.h>.

(stdio : standard input output).

Sans entr ´ees/sorties, il est impossible de produire des programmes

´evolu ´es ayant de grands impacts sur l’environnement, le syst `eme et la m ´emoire.

(3)

Les flux d’informations

Toutes interactions avec l’environnement et la m ´emoire (et leurs modifications) n ´ecessite de r ´ecup ´erer ou de constituer un flux d’informations.

Flux classiques :

I Texte tap ´e au clavier (entr ´ee)

I Mouvement de la souris et clic (entr ´ee)

I Fichiers sur le disque dur (entr ´ee/sortie)

I Position de la souris sur l’ ´ecran (entr ´ee/sortie)

I Texte affich ´e sur l’ ´ecran (sortie)

I R ´eseau (entr ´ee/sortie)

I Webcam (entr ´ee)

I ...

(4)

Les fichiers dans le langage C

Il est possible de manipuler (cr ´eer / lire / ´ecrire / d ´etruire) des fichiers du disque dur via des fonctions d’Entr ´ees/Sorties de la librairie

<stdio.h>.

Dans le langage C, les fichiers sont manipulables via un pointeur sur une structureFILE.

Proc ´ed ´e de manipulation de fichier:

I Ouverture du fichier, constitution de l’objet (FILE *) et placement du pointeur.

I Fonctions d’Entr ´ees/Sorties du langage C pour modifier des caract `eres sur le pointeur et d ´eplacer ce pointeur dans le fichier ouvert.

I Fermeture du fichier.

Le dernier caract `ere d’un fichier ouvert estEOFpour (End Of File).

(5)

Ouverture d’un fichier:fopen

Avant toute op ´eration sur un fichier, il est n ´ecessaire d’obtenir un pointeur de typeFILE *.

FILE *fopen(const char *path, const char *mode);

-pathcontient l’adresse du fichier `a ouvrir,-modepr ´ecise le mode d’ouverture.

I "r": mode lecture, pointeur au d ´ebut

I "w": mode ´ecriture, pointeur au d ´ebut, cr ´eation du fichier si non existant, effacement sinon. (ChevronUNIX >)

I "r+": mode lecture- ´ecriture, pointeur au d ´ebut

I "w+": mode lecture- ´ecriture, pointeur au d ´ebut, cr ´eation du fichier si non existant, effacement sinon.

I "a": mode ´ecriture, pointeur `a la fin, cr ´eation du fichier si non existant. (ChevronUNIX >>)

I "a+": mode lecture- ´ecriture, pointeur `a la fin, cr ´eation du fichier si non existant.

(6)

Fermeture d’un fichier:fclose

Une fois les modifications termin ´ees, il convient de fermer les fichiers ouverts.

int fclose(FILE *stream);

retourne 0 en cas de succ `es etEOFsinon.

R ´eouverture d’un fichier:freopen

R ´e-ouvre un fichier en fermant l’instance pr ´ec ´edemment ouverte.

FILE *freopen(const char *path, const char *mode, FILE

*stream);

A l’origine, cette fonction est conc¸ue pour permettre les redirections.

On l’utilisera rarement en pratique mais son recours est parfois contraint.

(7)

Les flux standards

Dans le langage C et pourUNIX(programm ´e en C), il existe des flux standards qui se comportent comme des fichiers pour lesquels l’utilisateur n’a pas `a se soucier de l’ouverture et fermeture.

I stdin: (standard input) est l’entr ´ee standard. Tout caract `ere tap ´e au clavier durant l’ex ´ecution d’un programme se retrouve dans ce flux.

I stdout: (standard output) est la sortie standard. Tout caract `ere

´ecrit dans ce flux sera affich ´e dans la console lors de l’ex ´ecution d’un programme. ATTENTION A LA BUFFERISATION.

I stderr: (standard error) est la sortie d’erreur standard.

Les fonctions d’Entr ´ees/Sorties du langage C op ´erant sur les fichiers et flux standards sont tr `es li ´ees. (printf - fprintf, scanf - fscanf, ...).

(8)

Fonctions d’Entr ´ees/Sorties du langage C

Les fonctions d’entr ´ees/sorties servent `a ´ecrire et r ´ecup ´erer des donn ´ees dans les fichiers ouverts et les flux standards.

int i;

char c;

...

fichier1mode lecture fichier2mode ´ecriture

stdin stdout fscanf

fprintf scanf

printf

Les fonctions primitives syst `emes sont tr `es difficiles `a 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 ´ees de

<stdio.h>.

(9)

scanf : lecture format ´ee sur l’entr ´ee standard

int scanf(const char *format, ...);

On remplace les ... par une liste d’adresses de conteneurs m ´emoires adapt ´es. Si on a une variableint i, l’adresse&ideiest un

conteneur m ´emoire adapt ´e `a 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 ( ” S a i s i s s e z v o t r e nom , un espace , p u i s v o t r e age ” ) ; 4 s c a n f ( ”%s %d ” , nom , &age ) ;

scanfretourne le nombre de variables affect ´ees par la saisie, cela permet de v ´erifier le bon d ´eroulement de la saisie.

(10)

printf : ´ecriture format ´ee sur la sortie standard

int printf(const char *format, ...);

On remplace les ... par une liste de variables adapt ´ees aux diff ´erents types apparaissant dans le format. Encore une fois, il faut respect ´e l’ordre de lecture de gauche `a droite.

Le texte format ´e avec les bonnes substitutions est ensuite affich ´e `a l’ ´ecran (modulo la bufferisation).

1 f l o a t t = 3 7 . 1 2 ; 2

3 p r i n t f ( ” La t e m p e r a t u r e de %s e s t %f ” , ” M a r t i n ” , f ) ;

En cas de succ `es,printfretourne le nombre de caract `eres ´ecrits sur la sortie standard (sans compter le caract `ere de fin de chaˆıne).

(11)

fscanf : lecture format ´ee sur un flux

int fscanf(FILE *stream, const char *format, ...);

On remplace les ... par une liste d’adresses de conteneurs m ´emoires adapt ´es. On r ´ecup `ere ainsi des donn ´ees dans le flux qui se place en valeur des adresses de variables donn ´ees.

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

fscanfretourne le nombre de variables affect ´ees par la saisie, cela permet de v ´erifier le bon d ´eroulement de la saisie.

Les flux standards se comportent comme des fichiers ouvert, ainsi : scanf(format, ...)est ´equivalent `afscanf(stdin, format, ...).

(12)

fprintf : ´ecriture format ´ee sur un flux

int fprintf(FILE *stream, const char *format, ...);

On remplace les ... par une liste de variables adapt ´ees aux diff ´erents types apparaissant dans le format. Encore une fois, il faut respect ´e l’ordre de lecture de gauche `a droite.

Le texte format ´e avec les bonnes substitutions est ensuite ´ecrit 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 ” , ” M a r t i n ” , age ) ;

En cas de succ `es,fprintfretourne le nombre de caract `eres ´ecrits sur le flux (sans compter le caract `ere de fin de chaˆıne).

printf(format, ...)est ´equivalent `afprintf(stdout, format, ...).

(13)

Il existe de nombreuse autre fonctions d’Entr ´ees/Sorties.

Lorsque l’on ne connaˆıt pas/plus une fonctionfooen langage C,LE SEUL R ´EFLEXE:on tapeman 3 foodans 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);

...

(14)

Soyez astucieux et perspicaces

Les noms de fonctions n’ont pas ´et ´e choisis au hasard.

I print-f: ´ecrire, format

I f-scan-f: flux, analyser, format

I f-get-c: flux, obtenir, caract `ere

I put-char: placer, caract `ere

I f-put-s: flux, placer, chaˆıne de caract `eres

I Lorsque le nom ne commence pas par unf, la fonction affecte les flux standards, sinon elle aura un flux parmi ses arguments.

I En fin de nom,cetchard ´esigne des caract `eres,sd ´esigne une chaˆıne de caract `eres,fque la fonction peut prendre des

´ecritures format ´ees (types diff ´erents).

(15)

Des param `etres dans la fonction main

Voici le prototype standard d’unmainacceptant des arguments:

int main(int argc, char* argv[])

I argcest un entier, il donne le nombre d’arguments pass ´es `a l’ex ´ecutable (en comptant le nom de l’ex ´ecutable comme premier argument).

I argvest un tableau de chaˆınes de caract `eres.

I argv[0]: le nom de l’ex ´ecutable (d ´epend du nom donn ´e `a la compilation).

I argv[1]: le nom du premier argument.

I argv[2]: le nom du second argument.

I ...

Similarit ´e avec le langage dubash:

$#se comporte commeargc

$0se comporte commeargv[0]

$1se comporte commeargv[1]

... (et tout est, a priori, chaˆınes de caract `eres)

(16)

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 f o r ( i =0 ; i<argc ; i + + ){ 7 p r i n t f ( ”%s\n ” , argv [ i ] ) ;

8 }

9 r e t u r n 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

(17)

Les arguments des ex ´ecutables pass ´es par la console sont des chaˆınes de caract `eres. Toutefois, le langage C poss `ede des fonctions de conversions entre ces types.

int atoi(const char *nptr);

retourne un entier `a partir d’une chaˆıne de caract `eres.

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 r e t u r n 0 ;

9 }

nicolas@lancelot:˜/test$ gcc -o test test.c -Wall -ansi nicolas@lancelot:˜/test$ ./test

12543

(18)

Comment alors faire un ex ´ecutable 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 f o r ( 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 r e t u r n 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

(19)

L’œuf ou la poule, UNIX ou le langage C ?

Le syst `eme d’exploitationUNIXet le langage C ont ´et ´e conc¸u de mani `ere relativement conjointe. Notamment, les flux standards (stdin, stdout, stderr) SONT LES M ˆEMES!

Un ex ´ecutable compil ´e `a partir de source ´ecrite en C bien programm ´e peut s’enchaˆıner dans des pipesUNIX `a volont ´e.

cons ´equences:

Toutes les donn ´ees r ´ecup ´er ´ees sur l’entr ´ee standard (scanf, getchar, ...) peuvent en fait ˆetre envoy ´e au programme via un chevron entrant<d’UNIXou un pipe|.

(20)

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 e t v o t r e age !\n ” ) ; 8 s c a n f ( ”%s %d ” , nom , &age ) ;

9 p r i n t f ( ” Ok , vous e t e s %s e t vous avez %d ans\n ” , nom , age ) ; 10 r e t u r n 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

(21)

1 # include <s t d i o . h>

2

3 i n t main (void){ 4 i n t c= g e t c h a r ( ) ; 5

6 \ ∗ Recopiage de l e n t r e e s t a n d a r d s u r l a s o r t i e s t a n d a r d ∗ \ 7 while ( c ! = EOF ){

8 p u t c h a r ( c ) ; 9 c = g e t c h a r ( ) ;

10 }

11 r e t u r n 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

(22)

Bufferisation

La sortie standard est bufferis ´ee: Les fonctions d’Entr ´ees/Sortie de

<stdio.h>n’envoient pas directement les ´el ´ements sur l’ ´ecran.

UNIXincite `a l’enchaˆınement de commandes ou ex ´ecutables via des pipes. Mais la communication entre les processus a un co ˆut. Surtout si l’on perd son temps `a communiquer sans arr ˆet des messages tout petits.

printf ´ecrit sur le buffer de la sortie standard (de taille 8192 Octets par d ´efaut) et une fois le buffer plein (ou un retour `a ligne, ou un flush, ou ...), on sollicite le processus d’affichage `a l’ ´ecran.

Note: La sortie d’erreur n’est pas bufferis ´e et affiche les caract `eres d `es l’ajout dans le flux.

(23)

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 e s t l ’ e r r e u r de segment ation ” ) ; 7 nom [ 3 4 ] = 123;

8 r e t u r n 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 `u est pass ´e leprintf? l’erreur de segmentation se trouve avant ?

(24)

Solution 1:

1 # include <s t d i o . h>

2

3 i n t main (void){ 4 char nom= ” Jean ” ; 5

6 / Un s a u t 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 e s t l ’ e r r e u r de segment ation\n ” ) ; 8 nom [ 3 4 ] = 123;

9 r e t u r n 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 s u r 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 e s t l ’ e r r e u r de segment ation ” ) ; 8 nom [ 3 4 ] = 123;

9 r e t u r n 0 ; 10 }

Références

Documents relatifs

[r]

´ el´ ementaire Cons´ equences. Coordonn´

• Ex ´ecuter les t ˆaches de base de la gestion des donn ´ees, telle que l’insertion, la modification et la suppression de donn ´ees des tables. • Effectuer des requ ˆetes

• Ex ´ecuter les t ˆaches de base de la gestion des donn ´ees, telle que l’insertion, la modification et la suppression de donn ´ees des tables. • Effectuer des requ ˆetes

Bulletin d’inscription à retourner à : CIVAM Bio 30 Julie PERRIN Domaine de Puechlong 30610 Saint-Nazaire-des-Gardies Nom : Prénom : Adresse : Tél : Email : ❐S’inscrit à

Pour trouver les coordonn´ ees d’un point dans un rep` ere, on ´ ecrit l’´ equation (vectorielle) caract´ eristique on convertit cette ´ equation en syst` eme num´ erique on

• Les sorties de certains neurones sont connect´ees aux entr´ees d’autres neurones.. • Les entr´ees non connect´ees sont les entr´ees

Bruno Bouzy UFR math info.. On écrira une fonction pour chacun des quatre opérateurs. Pourquoi?. 5)Programmer les fonctions CARRE qui reçoit en paramètre entier et lui affecte